Edited at

Renesas V850 64bit Linux版gccコンパイラ


概要

フリーの v850 gcc ソースは,以下で公開されています.

https://gcc-renesas.com/ja/v850/v850-source-code/

今回,上記ソースを 64bit版Linuxでビルドできるようになりましたので,ビルド手順を公開します.

下記手順は,2018年10月/TOPPERS開発者会議で開発協力して頂ける方々から頂いた情報をもとに手順化しております(感謝).


ビルド環境


  • OS


    • Windows10 pro



  • ビルド用端末


    • WSL



$ uname -a

Linux 4.4.0-17134-Microsoft #345-Microsoft Wed Sep 19 17:47:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux

$cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"


使用したライブラリ

GNU FTPサイトから,以下のライブラリを取得しました.


  • gmp-6.1.2

  • mpfr-4.0.0

  • mpc-1.1.0

また,binutils と newlib は,https://gcc-renesas.com/ja/v850/v850-source-code/ から取得しました.


  • binutils-2.24

  • newlib-2.1.0

当初,GNU FTPサイトから binutils/newlibを取得していましたが,ルネサスさんの方でいくつかカスタイズされておられるようで,特定のコンパイルオプション認識しない問題や,bcond命令が RH850向けに生成されてしまう問題が発生したため,ルネサスさんの公開ソースをベースにビルドするようにしました.


フォルダ構成

ビルド実施時のフォルダ構成は以下で行っています.

.

├── binutils-2.24
├── gcc-4.9.2
├── newlib-2.1.0
└── other
├── gmp-6.1.2
├── mpc-1.1.0
└── mpfr-4.0.0


ライブラリビルド手順

gmp, mpc, mpfr は以下のサイトを参考にしました(感謝).

http://syohex.hatenablog.com/entry/20120705/1341459296


環境変数登録

以下の環境変数(PATH, LD_LIBRARY_PATH)を追加します.

export PATH=/usr/local/bin/:${PATH}

export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib:${LD_LIBRARY_PATH}


gmp

gmp ソースをに任意のフォルダで解凍し,解凍したフォルダ直下に build フォルダを作成後,以下のコマンドを実行します.

$ CPPFLAGS=-fexceptions ../configure --prefix=/usr/local --enable-cxx

$ make
$ make check
$ sudo make install


mpfr

mpfr ソースをに任意のフォルダで解凍し,解凍したフォルダ直下に build フォルダを作成後,以下のコマンドを実行します.

$ ../configure --prefix=/usr/local --with-gmp-build=../../gmp-6.1.2/build

$ make
$ make check
$ sudo make install


mpc

mpc ソースをに任意のフォルダで解凍し,解凍したフォルダ直下に build フォルダを作成後,以下のコマンドを実行します.

$ ../configure --prefix=/usr/local --with-gmp=/usr/local --with-mpfr=/usr/local

$ make
$ make check
$ sudo make install


gcc ビルド環境

ビルド前のファイル構成

$ ls

gcc-4.9.2_v850_v14.01.tar.bz2 newlib-2.1.0_v850_v14.01.tar.bz2 binutils-2.24_v850_v14.01.tar.bz2

gcc, binutils, newlib ソースをに任意のフォルダで解凍し,解凍したフォルダ直下に,それぞれ build フォルダを作成します.


binutils

binutils の build フォルダ直下で,以下のコマンドを実行します.

$  ../configure --target=v850-elf --prefix=/usr/local --enable-soft-float

$ make
$ sudo make install


gcc ビルド手順

gcc の build フォルダ直下で,以下のコマンドを実行します.

$ ../configure --target=v850-elf --prefix=/usr/local --enable-languages=c,c++ --disable-nls --disable-multilib --disable-libssp --with-newlib --with-header=../../newlib-2.1.0/newlib/libc/include

$ make
$ sudo make install


ビルド結果確認

パス確認

$ which v850-elf-gcc

/usr/local/bin//v850-elf-gcc

バージョン確認

$ v850-elf-gcc --version

v850-elf-gcc (GCC) 4.9-GNUV850_v14.01
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


newlibのビルド手順

gcc のコンパイルが終わったら,newlib の build フォルダ直下で,以下のコマンドを実行します.

※newlibをビルドするには,クロスコンパイラが出来上がっている必要があります.

$ ../configure --target=v850-elf --prefix=/usr/local

$ make
$ sudo make install


その他気づいたこと

当初,gcc は,GNUのFTPサイトから取得してビルドしました.

試したバージョンは以下の通りでしたが,athrill との相性があまりよくないことがわかりました.

相性が悪い理由を以下に示します.



  • gcc-4.9.2.tar.gz


    • アセンブラファイル(.S)のソースデバッグができない.

    • コンパイル済みのアセンブラファイル(オブジェクトファイル)に対して,以下のコマンドを実行しましたが,なぜか .debug_lineが出力されませんでした.

    • $ v850-elf-readelf --debug-dump <オブジェクトファイル>




  • gcc-8.2.0.tar.gz


    • デバッグ情報 dwarf のバージョンが athrillのバージョンと合わない.

    • athrillはdwarf2 までしか対応しきれていませんが,最新のgcc ではdwarf4の

    • デバッグ情報が出力されるようです.-gdwarf2でオプション指定してもダメでした.

    • さらに,このコンパイラでビルドしたバイナリをathrillで実行するとSIGSEGVで落ちます…

    • athrillのdwarf4対応は課題ですね.



上記をトライしてダメでしたので,ルネサスサイトの「GNUV850 v14.01 Source Code of GCC」でコンパイルすることにしました.

athrill向けのクロスコンパイラはもともとルネサスサイトのv850-gccバイナリを使用していたので,やはりこちらの方が相性は良いようです.

上記でビルドしたクロスコンパイラを使用して過去のathrill sampleをビルドしていて気づきましたが,

「-msoft-float」を認識できないようです.以下のエラー出力がされてしまいました.

クロスコンパイラ作成時に何らかのオプション指定が必要だったのかもしれない.

おそらく,以下のページがヒントになりそうですので,また空き時間見つけて,リコンパイルします.

http://lists.atmark-techno.com/pipermail/armadillo/2007-September/001996.html

※gccコンパイル時のオプションに --with-float=soft を指定する

Assembler messages:

Error: unrecognized option -msoft-float


-msoft-floatが認識できない問題の調査状況

gccコンパイル時のオプションに --with-float=soft を追加したところ,configureで失敗しました.

gcc の configure のオプションを色々と調べたところ,以下のサイトにヒントがありました.

http://msyksphinz.hatenablog.com/entry/2015/06/18/020000

--enable-soft-float を付加すれば gcc が認識してくれそうだと思い,こちら試してみましたが,現象変わらず.

以下のエラーメッセージが出力されます.

Assembler messages:

Error: unrecognized option -msoft-float

現状,手詰まり感ありで,調査の方向性がみていない状況になってしまいました…


bcond問題の調査状況

当初,GNU FTP サイトの binutils-2.25.1 を使用したところ,bcond命令のジャンプサイズが255を超える命令を出力していることがわかりました.

-mv850e2v3 オプション指定の場合,ジャンプサイズは255を超えないはずなのに,超えてしまったことが問題です(RH850向けのオプション指定(-mv850e3v5)ならOKなのですが).

そこで,ルネサスさんの binutilsのソース(2.24)と GNUサイトのソース(2.24)の差分調査したところ,bcond命令周りでいくつか修正が入っていることがわかりました.

また,この調査をしていて,たまたまですが,追加で分かったこととして,-msoft-floatに関する修正が入っていることもわかりました.

というわけで,ルネサスさんのサイトの binutilsを使用する方が良いと判断しました.

最初からそうすればよかったのですが,ルネサスさんのサイトのbinutilsはビルドエラーが発生するので,GNUサイトから取得していたという経緯があります.

いずれにせよ,発生したコンパイルエラーは,それほど難しいものではないので,強引に修正しビルドを通しました.本 binutilsを使用することで,bcond 問題も -msoft-float 問題も無事解決できました!


64bit linux v850-gcc バイナリ公開

ここで作成したクロスコンパイラを,以下で公開しました.

https://github.com/tmori/athrill-gcc/tree/master/linux/64bit

展開すると,usr/local/athrill-gcc の下に配置されますので,

usr/local/athrill-gcc/bin をPATH設定すればビルドできるようになります.



  • 2018/12/28追記


    • v850-elf-g++ を上記に追加しました.

    • サイズが100MBを超えてしまったので,git lfs でコミットしました.

    • その他,浮動小数点演算のハード命令を含むnewlibを追加しています.

    • 上記は自分でビルドしたものではなく,ルネサスさんの公式サイトから取得したものをマージしました.

    • (ルネサスさんのライブラリはクロスコンパイル済みなので,32bit/64bit関係なく使えますから,自分でビルドする必要なかったなと気づきました…)




  • 2019/10/14追記


    • git-lfs の容量が不足してしまいましたので,公開リポジトリを削除しました..




  • 2019/10/20追記




履歴


  • 2018.11.04 新規作成

  • 2018.11.05 幾つかご指摘いただいた点を改修しました.


    • gmpのビルド手順(sudo make install)

    • newlib のビルド順番はgccの後でした.

    • フォルダ構成を追加



  • 2018.11.06 -msoft-floatが認識できない問題を追記

  • 2018.11.07 -msoft-floatが認識できない問題の調査状況を追記(まだ解決できていない)

  • 2018.11.08 64bit linux v850-gcc バイナリを github で公開

  • 2018.11.17 諸問題あり,binutilsをルネサスさんのサイトのソースに差し替えました

  • 2018.12.28 gccのビルドコマンドにc++のオプションを追加しました

  • 2018.12.28 c++を同梱したv850-gccをgithubで公開

  • 2019.02.04 binutilsのビルドオプション情報を追記

  • 2019.10.14 公開リポジトリを削除

  • 2019.10.20 athrill-gcc-packageを追加