新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

step2

echoesI:000-gcc> cat *02.txt

                                                        • o

xilix のオリジナル
binutils のコンパイル
makeinfo を ubuntu にインストール(とほほ)
java 関連が入り始めて makeinfo が必要になったため。

あーまちがえてた。もいちど。

binutils の再コンパイル
結局 makeinfo をインストールしても makeinfo でこけるので
Makefile を書き換える、、、、とほほ

あーまちがえてた。もいちど。

../../../mb_gnu/src/binutils/configure --prefix=/home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc --target=microblaze-nommu-linux-uclibc
bfd/Makefile を書き換え
rm bfd/archive.* をして再度 make
ど〜よ。
install
ど〜よ。 ど〜よ。

                                                                            • -

sysroot 指定してなかった、、、、
binutils は関係ない気もするけど。

再再度コンパイル開始。
../../../mb_gnu/src/binutils/configure --prefix=/home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc --target=microblaze-nommu-linux-uclibc --with-build-sysroot=/home/ryos/FPGA_Linux/install/mb/microblaze/

bfd/Makefile を書き換え
rm bfd/archive.* をして再度 make

install
これで [linux kernel + uclibc の sysroot ]に依存した ld ができたんんんんだ。
TODO
binutils sysroot 関係あるか?->ある
configure にわざわざあり、ChangeLog にもあるところから関係あり麻生
Makefile にSYSROOT_CFLAGS_FOR_TARGETが追加される
XGCC_FLAGS_FOR_TARGET に --sysroot= が引き渡される
--buid-sysroot もひきわたされるみたいだぞ

                                                        • o

難しい判断だけど
elf2flt を導入するべきなので、ここで導入。
すごくむずかしいい configure だ。
まずは heavens-door のコピー
$ ./configure --target=microblaze-elf --with-libbfd=/opt/xtools/uclinux-uclibc/microblaze-uc-linux-gnu/lib/libbfd.a --with-libiberty=/opt/xtools/uclinux-uclibc/lib/libiberty.a --with-bfd-include-dir=/opt/xtools/uclinux-uclibc/include/ --with-binutils-include-dir=/home/ryos/FPGA_Linux/gnu/mb_gnu/src/gcc/include/ --prefix=/tmp/mb-elf
blog によると

ダウンロードしてコンパイル。一部 libiberity.h にあるはず PEX_LAST | PEX_SEARCHのが binutils になかったので gcc のをインクルードするようにしてコンパイル。
l

README をよむ
./configure --target= --with-libbfd= --with-libiberty=
とりあえず README とおりにやる。o
やはり

    • target=microblaze-nommu-linux-uclibc

はうけつけずk
microblaze-elf にする。

    • with-bfd-include-dir=

にしろといわれた。

Run configure again specifying these options:

./configure --target= --with-bfd-include-dir=

--with-libbfd= --with-libiberty=

make してみる。
/home/ryos/FPGA_Linux/gcc-work/work/gcc-for-uclibc/binutils2/bfd/bfd.h:38:22: fatal error: ansidecl.h: そのようなファイルやディレクトリはありません
けっきょく heavens-door とほぼ同じ
./configure --target=microblaze-elf --with-libbfd=/home/ryos/FPGA_Linux/gcc-work/work/gcc-for-uclibc/binutils2/bfd/libbfd.a --with-libiberty=/home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc/lib/libiberty.a --with-bfd-include-dir=/home/ryos/FPGA_Linux/gcc-work/work/gcc-for-uclibc/binutils2/bfd --with-binutils-include-dir=/home/ryos/FPGA_Linux/gcc-work/mb_gnu/src/binutils/include --prefix=/tmp/mb-elf

ダウンロードしてコンパイル。一部 libiberity.h にあるはず PEX_LAST | PEX_SEARCHのが binutils になかったので gcc のをインクルードするようにしてコンパイル。
これもおなじじゃないか、、、

どうも binutils が古いんだ、、、、
一夜明ける
あーちがうちがう microblaze のライブラリをリンクしてどうする。


./configure --target=microblaze-elf --with-libbfd=/home/ryos/FPGA_Linux/gcc-work/work/gcc-for-uclibc/binutils2/bfd/libbfd.a --with-libiberty=/home/ryos/FPGA_Linux/gcc-work/work/gcc-for-uclibc/binutils2/libiberty/libiberty.a --with-bfd-include-dir=/home/ryos/FPGA_Linux/gcc-work/work/gcc-for-uclibc/binutils2/bfd --with-binutils-include-dir=/home/ryos/FPGA_Linux/gcc-work/mb_gnu/src/binutils/include/ --prefix=/tmp/mb-elf
おー
結局また最初のエラーに戻る。
ld-elf2flt.c:127:24: error: ‘PEX_LAST’ undeclared (first use in this function)
ld-elf2flt.c:127:24: note: each undeclared identifier is reported only once for each function it appears in
ld-elf2flt.c:127:35: error: ‘PEX_SEARCH’ undeclared (first use in this functio

どうも binutils が古いんだ、、、、
libiberty が古いんだ。gcc のインクルードを使うことにするか。
きっと最後はリンクエラーになるに違いない。

ほほー今度は elf/microblaze.h がないと。
こりゃあかんね。

結局、elf2flt はあるバージョン以降の binutils の libiberty に依存していて
microblaze 用の 2.16 の binutils は古い。ただし、libiberty はかなり
一般的なライブラリのはずなので elf2flt を作るためだけに、最新の
binutils をコンパイルすることにしよう。gcc のとをちゃんぽんにしてもだめ
だからね。

注意点として elf/microblaze.h の差異にだけは気を付けることにしよう。
意味的に違いがないことを確認。 ok.

../../../gnu_orig/binutils-2.22/configure --prefix=/home/ryos/FPGA_Linux/x-install/mb-nommu-linux-uclibc --target=microblaze-nommu-linux-uclibc --with-build-sysroot=/home/ryos/FPGA_Linux/install/mb/microblaze/

bfd にはかなり差があった。

結局
./configure --target=microblaze-elf --with-libbfd=/home/ryos/FPGA_Linux/gcc-work/work/gcc-for-uclibc/binutils2/bfd/libbfd.a --with-libiberty=/home/ryos/FPGA_Linux/gcc-work/work/gcc-for-uclibc/binutils_for_only_elf2flt/libiberty/libiberty.a --with-bfd-include-dir=/home/ryos/FPGA_Linux/gcc-work/work/gcc-for-uclibc/binutils2/bfd --with-binutils-include-dir=/home/ryos/FPGA_Linux/gcc-work/gnu_orig/binutils-2.22/include/ --prefix=/tmp/mb-elf

bfd は 2.16 のを libiberty は 2.22 のを使うようにした。ちゃんぽん。
bfd は自動生成される部分があるので、2.22 のを使わないほうがいいという判断。
っていうか、2.22 に全部統一したい。

インストールの前に Makefile の install の項を読む。
やっぱり ld を置き換えてますね。

Makefile の変更とチェック

prefix = /home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc
TARGET = microblaze-nommu-linux-uclibc

check_install:
echo $(TARGET)
echo $(bindir)
echo $(target_bindir)
ls $(target_bindir)/ld
ls $(bindir)/$(TARGET)-ld

make check_install
で念のためにチェック
問題ないようなので make install

これで [linux kernel + uclibc の sysroot ]に依存した ld + elf2flt ができたんんんんだ。

                                                        • o

さぁおおもの gcc

../../../mb_gnu/src/gcc/configure --target=microblaze --prefix=/home/ryos/FPGA_Linux/sysroot/mb --enable-multilib --disable-libssp --disable-newlib-atexit-dynamic-alloc --enable-optimize-memory --enable-languages=c,c++ --with-build-sysroot=/home/ryos/FPGA_Linux/install/mb/microblaze/
こんどは sysroot をわすれていない。ちょっとえらいぞ。

multilib は微妙だな。LE のオブジェクトが入ってくるとややこしくなる。
le だけ抑制できないのかな、、、、

ぜんぜんえらくない
target まちがい
../../../mb_gnu/src/gcc/configure --target=microblaze-nommu-linux-uclibc --prefix=/home/ryos/FPGA_Linux/sysroot/mb --enable-multilib --disable-libssp --disable-newlib-atexit-dynamic-alloc --enable-optimize-memory --enable-languages=c,c++ --with-build-sysroot=/home/ryos/FPGA_Linux/install/mb/microblaze/

再再度コンパイル
pthread.h がないと言ってエラー

  • sysroot は設定されている、、、なぞ

げ、、、、sysroot は usr/include を前提にしていた。
make CROSS=microblaze- PREFIX=/home/ryos/tmp/jgeil install
して、sysroot からけずって再度インストール。
とおもったけど、こりゃあかん。最初からや
------
binutils install
gcc install
linux kernel include インストール

まず linux の include を
素の gcc へコピーだ。
find include/ | cpio -pdumv ~/FPGA_Linux/install/mb/microblaze/usr
!!usr!!
asm も こぴして ln -s
find arch/microblaze/include | cpio -pdumv ~/FPGA_Linux/i .....
usr/include/microblaze/asm をつくってそこを
usr/include/asm にシンボリックリンク
!!usr!!
linux カーネル生成時に自動生成されるファイルが足りない。
usr/include/generated にあるのでシンボリックリンクする。
!!usr!!

これで 素の gcc + linux kernel の sysroot ができたんんだ。

あーなるほど。
incdlude lib は usr と関係ない世界で
usr 以下は usr (unix と関係ある)世界なんだ。

なるほどね。ほんらい /bin はそうあるべきなんだ、、、、
usr == unix-usr という世界なんだ。
まぁそこまできれいにはなってないし、みんな適当にやっているけどね。
debian って厳格に決めてたんだっけ、、、

でもって、
make CROSS=microblaze- PREFIX=/home/ryos/tmp/jgeil install
から usr/include と usr/lib を cpio

でもって。backup

                                                        • o

これで 素の gcc + linux kernel + uclibc の sysroot usr 版ができたんんんんだ。
で binutils はそのままだから(いやほんとはダメだけど)
これで [linux kernel + uclibc の sysroot ]に依存した ld + elf2flt ができたんんんんだ。

                                                        • o

さて gcc ですよ

../../../mb_gnu/src/gcc/configure --target=microblaze-nommu-linux-uclibc --prefix=/home/ryos/FPGA_Linux/sysroot/mb --enable-multilib --disable-libssp --disable-newlib-atexit-dynamic-alloc --enable-optimize-memory --enable-languages=c,c++ --with-build-sysroot=/home/ryos/FPGA_Linux/install/mb/microblaze/

pthread でえらー
どうやら newlib の pthread をコンパイルしている。

diable-pthreads とやるべきなのかな。
おそらく glibc は thread をもっているので素直にいくのでしょう。
しかし、uclibc の設定で thread をせってしていなかた(ことが判明)
ので、エラーになったと、、、やはり usr と / は分かれるべきだと。
gcc が usr を見ているのにはそれなりの理由があるな。

再挑戦

../../../mb_gnu/src/gcc/configure --target=microblaze-nommu-linux-uclibc --prefix=/home/ryos/FPGA_Linux/sysroot/mb --enable-multilib --disable-libssp --disable-newlib-atexit-dynamic-alloc --enable-optimize-memory --enable-languages=c,c++ --with-build-sysroot=/home/ryos/FPGA_Linux/install/mb/microblaze/ --disable-threads

pthread の問題はクリアーしたようだ。

この ld は該当の sysroot をつかってません!!でエラー
/home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc/bin//microblaze-nommu-linux-uclibc-ld: this linker was not configured to use sysroots
collect2: ld はステータ

どうもやっぱり binutils が古いみたい、、、、
まともにいかないな、、、、
こりゃみんな一回作ったからいいやで、上書きしているな。
こうなると sysroot は使えないから、binutils を作った時点で usr を
コピーすることになるな。

                                                        • o

binutils からやりなおし。
../../../mb_gnu/src/binutils/configure --prefix=/home/ryos/FPGA_Linux/x-install/mb-nommu-linux-uclibc --target=microblaze-nommu-linux-uclibc

make install

あれおかしい、、、
prefix まちがえてた

                                                        • o

もう一度 binutils の sysroot をチェック。

../../../mb_gnu/src/binutils/configure --prefix=/home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc --target=microblaze-nommu-linux-uclibc --with-sysroot=/home/ryos/FPGA_Linux/install/mb/microblaze/

あれ〜〜〜とおりはじめたよ。
--with-build-sysroot としなくなったからか、、、
こりゃ sysroot 使わないほうがいいな。

が〜〜ん

/home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc/bin//microblaze-nommu-linux-uclibc-ld: このバグを報告してください。

ld のバグ

crtendS.o のターゲット特有データの併合に失敗しました
/home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc/bin//microblaze-nommu-linux-uclibc-ld: BFD 2.16 内部エラー。 microblaze_elf_relocate_section 内 945 行 /home/ryos/FPGA_Linux/gcc-work/mb_gnu/src/binutils/bfd/elf32-microblaze.c で中止しま した

                                                        • o

peta 版でもう一度 binutils の sysroot をチェック。

../../../petalogix/binutils/configure --prefix=/home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc --target=microblaze-nommu-linux-uclibc --with-sysroot=/home/ryos/FPGA_Linux/install/mb/microblaze/
どうやら、やはり le をコンパイルしようとしたね。

                                                        • o

さてどうするか。

    • multilib をやめれば le はつくらないな。
                                                                            • -

gcc に le つくらないように修正。(自身なし)
おー peta の gcc はそのように修正してあった、、、、
よっしゃ。同じ道をたどっているという事はいい証拠だ。

ハイ最初から
../../../mb_gnu/src/binutils/configure --prefix=/home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc --target=microblaze-nommu-linux-uclibc --with-build-sysroot=/home/ryos/FPGA_Linux/install/mb/microblaze/

    • with-built-sysroot の再チェックもかねて。

../../../mb_gnu/src/gcc/configure --target=microblaze-nommu-linux-uclibc --prefix=/home/ryos/FPGA_Linux/sysroot/mb --enable-multilib --disable-libssp --disable-newlib-atexit-dynamic-alloc --enable-optimize-memory --enable-languages=c,c++ --with-build-sysroot=/home/ryos/FPGA_Linux/install/mb/microblaze/ --disable-threads

/home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc/bin//microblaze-nommu-linux-uclibc-ld: this linker was not configured to use sysrootscollect2: ld はステータ結局ダメ。

                                                                            • -

sysroot なしでやり直し。
../../../mb_gnu/src/binutils/configure --prefix=/home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc --target=microblaze-nommu-linux-uclibc

ar の確認後インストール
rem:binutils2> nm binutils/ar | grep sprintf
U __sprintf_chk@@GLIBC_2.3.4
000000000042d220 T _bfd_elf_sprintf_vma
000000000040bde0 T bfd_sprintf_vma
U sprintf@@GLIBC_2.2.5

でふぉるるとの sysroot に usr を cpio
newlib の設定もいらないことに気が付いたので configure のオプションも
だいぶシンプルになってきた。
../../../mb_gnu/src/gcc/configure --target=microblaze-nommu-linux-uclibc --prefix=/home/ryos/FPGA_Linux/sysroot/mb --enable-multilib --disable-libssp --enable-optimize-memory --enable-languages=c,c++ --disable-threads

LE をでぃせぶるする修正が入っているのでこれで最後までうまくいくはず。
C++ でひっかかった、、
make[1]: *** [configure-target-libstdc++-v3] エラー 1
make[1]: ディレクトリ `/home/ryos/FPGA_Linux/gcc-work/work/gcc-for-uclibc/gcc'
TODO
C++ のライブラリでエラー。
-lm の関連、、、、

c++ やめる、、、
../../../mb_gnu/src/gcc/configure --target=microblaze-nommu-linux-uclibc --prefix=/home/ryos/FPGA_Linux/sysroot/mb --enable-multilib --disable-libssp --enable-optimize-memory --enable-languages=c --disable-threads

                                                                            • -

いやまだだ。
とりあえず save。
が〜〜ん。まちがえていた。

../../../mb_gnu/src/gcc/configure --target=microblaze-nommu-linux-uclibc --prefix=/home/ryos/FPGA_Linux/install/mb-nommu-linux-uclibc --enable-multilib --disable-libssp --enable-optimize-memory --enable-languages=c --disable-threads

できない、、、、