久々にMicroBlazeのクロスコンパイラを再構築した

久々にMicroBlazeのクロスコンパイラを再構築してみた。

今回もMicroBlaze用クロスコンパイラ(LittleEdian版)を構築です。

以前にも手順を書いたけど、再度、おさらいのため書いてみた。

まず、ここで目指すのはXilinxのSDKやEDKなどを使用しなくても、MicroBlaze用ELFバイナリファイルをコンパイルできるようになることが目標です。

さらに以前は本家のGCCを使用したクロスコンパイラの生成スクリプトなども作っていたけど、LittleEndianが含まれていなかったので今回もXilinxのgitからソースコードをダウンロードして、LittleEndian対応のクロスコンパイラを作成します。

今回の環境はFedora17です。

他のディストリビューションでも特に問題ないはずです。

下記の要領で、Xilinxのgitサーバからソースコードをダウンロードして、クロスコンパイラ環境を構築していきます。

まず、mb-gccを構築するためには、gcc、g++、gcc-objc、gcc-objc++が必要なので先にインストールしておきます。

問題がなければ下記の順番で実行していきます。

% git clone git://git.xilinx.com/mb_gnu.git

% cd mb_gnu

% ./build_binutils.sh

% ./build_gcc.sh

build_binutils.shを実行中に下記のようにGprofでエラーが発生することがある。


Build: binutils-2.16

Target: microblaze-xilinx-elf

CWD: /home/hidemi/workspace/MicroBlaze/mb_gnu

CFLAGS: -O2

Version String: Xilinx 11.1 Build EDK_L.14 19 Sep 2012

Platform: lin64

Build started: Wed Sep 19 23:50:58 JST 2012

Configuring... rc = 0.

Compiling... rc = 0.

Installing... rc = 0.

Installing libbfd.a... rc = 0.

Installing libbfd headers... rc = 0.

Configuring Gprof... rc = 0.

Compiling Gprof... rc = 2.

Exiting because of previous errors

エラーの内容は下記のとおりである。

/hoge/mb_gnu/src/binutils/gprof/flat_bl.m:2:2: error: expected identifier or ‘(’ before ‘%’ token

以前もググってみて、それなりのページを探すことができ、Object-C関係のエラーというところまでわかっているが具体的な解決方法は見つけていない。

今回もエラーが出ててもgprofだけ構築されないのでここは無視してbuild_gcc.shを実行する。


Build: gcc-4.1.2 newlib-1.14.0

Target: microblaze-xilinx-elf

CWD: /home/hidemi/workspace/MicroBlaze/mb_gnu

CFLAGS: -O2

Version String: Xilinx 11.1 Build EDK_L.14 20 Sep 2012

Platform: lin64

Build started: Thu Sep 20 00:27:18 JST 2012

Configuring... rc = 0.

Compiling... rc = 0.

Installing... rc = 0.

Build libraries started: Thu Sep 20 00:44:02 JST 2012


Build: newlib-1.14.0 multilib variants

Building newlib little endian variants...

   install libm_le_m_bs_p_fps.a -- rc = 0.

   install libm_le_m_bs_p_fpd.a -- rc = 0.

   install libm_le_m_p_fps.a -- rc = 0.

   install libm_le_m_p_fpd.a -- rc = 0.

   install libm_le_bs_p_fps.a -- rc = 0.

   install libm_le_bs_p_fpd.a -- rc = 0.

   install libm_le_p_fps.a -- rc = 0.

   install libm_le_p_fpd.a -- rc = 0.

   install libm_le_m_bs_fps.a -- rc = 0.

   install libm_le_m_bs_fpd.a -- rc = 0.

   install libm_le_m_fps.a -- rc = 0.

   install libm_le_m_fpd.a -- rc = 0.

   install libm_le_bs_fps.a -- rc = 0.

   install libm_le_bs_fpd.a -- rc = 0.

   install libm_le_fps.a -- rc = 0.

   install libm_le_fpd.a -- rc = 0.

   install libm_le_m_bs_p.a -- rc = 0.

   install libm_le_m_p.a -- rc = 0.

   install libm_le_bs_p.a -- rc = 0.

   install libm_le_p.a -- rc = 0.

   install libm_le_m_bs.a -- rc = 0.

   install libm_le_m.a -- rc = 0.

   install libm_le_bs.a -- rc = 0.

   install libm_le.a -- rc = 0.

   install libc_le_m_bs_p.a -- rc = 0.

   install libc_le_m_p.a -- rc = 0.

   install libc_le_bs_p.a -- rc = 0.

   install libc_le_p.a -- rc = 0.

   install libc_le_m_bs.a -- rc = 0.

   install libc_le_m.a -- rc = 0.

   install libc_le_bs.a -- rc = 0.

   install libc_le.a -- rc = 0.

Building newlib big endian variants...

   install libm_m_bs_p_fps.a -- rc = 0.

   install libm_m_bs_p_fpd.a -- rc = 0.

   install libm_m_p_fps.a -- rc = 0.

   install libm_m_p_fpd.a -- rc = 0.

   install libm_bs_p_fps.a -- rc = 0.

   install libm_bs_p_fpd.a -- rc = 0.

   install libm_p_fps.a -- rc = 0.

   install libm_p_fpd.a -- rc = 0.

   install libm_m_bs_fps.a -- rc = 0.

   install libm_m_bs_fpd.a -- rc = 0.

   install libm_m_fps.a -- rc = 0.

   install libm_m_fpd.a -- rc = 0.

   install libm_bs_fps.a -- rc = 0.

   install libm_bs_fpd.a -- rc = 0.

   install libm_fps.a -- rc = 0.

   install libm_fpd.a -- rc = 0.

   install libm_m_bs_p.a -- rc = 0.

   install libm_m_p.a -- rc = 0.

   install libm_bs_p.a -- rc = 0.

   install libm_p.a -- rc = 0.

   install libm_m_bs.a -- rc = 0.

   install libm_m.a -- rc = 0.

   install libm_bs.a -- rc = 0.

   install libc_m_bs_p.a -- rc = 0.

   install libc_m_p.a -- rc = 0.

   install libc_bs_p.a -- rc = 0.

   install libc_p.a -- rc = 0.

   install libc_m_bs.a -- rc = 0.

   install libc_m.a -- rc = 0.

   install libc_bs.a -- rc = 0.

Setting up multilib links...

Build libraries completed: Thu Sep 20 00:51:05 JST 2012.

Build completed: Thu Sep 20 00:51:06 JST 2012.

バージョンが上がってるかなと期待したが、前と一緒だった。

と、思ったら・・・

あるではないですか!

% git clone git://git.xilinx.com/mb_gnu_4.6.2.git

% cd mb_gnu_4.6.2

% ./build_binutils.sh


Build: binutils-2.16

Target: microblaze-xilinx-elf

CWD: /home/hidemi/workspace/MicroBlaze/mb_gnu_4.6.2

CFLAGS: -O2

Version String: Xilinx 14.1 Build EDK_P.15 20 Sep 2012

Platform: lin64

Build started: Thu Sep 20 01:25:18 JST 2012

Configuring... rc = 0.

Compiling... rc = 2.

Exiting because of previous errors

あらら、エラーが出てしまいました。

ログを見てみると・・・

gcc -O2  -o sysinfo sysinfo.o syslex.o

syslex.o: In function `main'':

syslex.c:(.text.startup+0x0): multiple definition of `main''

sysinfo.o:sysinfo.c:(.text.startup+0x0): first defined here

いやはや・・・ひとまず、今日はここまで。

write: 2012/09/19/ 23:40:28