mipsel用にnewlib-3.0.0.20180831をlinuxのtoolchainを使ってコンパイルしてみた。toolchainはいろいろ探したら、gcc 4.2.3な物が見つかったので、これを使いました。
% mips-cc -v
Using built-in specs.
Target: mipsel-linux-uclibc
Configured with: /home/gracecsm/toolchains/src/toolchains/linux-2.6/buildroot/to
olchain_build_mipsel/gcc-4.2.3/configure --prefix=/projects/hnd/tools/linux/hndt
ools-mipsel-linux-uclibc-4.2.3 --build=i386-pc-linux-gnu --host=i386-pc-linux-gn
u --target=mipsel-linux-uclibc --enable-languages=c,c++ --disable-__cxa_atexit -
-enable-target-optspace --with-gnu-ld --with-gmp=/home/gracecsm/toolchains/src/t
oolchains/linux-2.6/buildroot/toolchain_build_mipsel/gmp --with-mpfr=/home/grace
csm/toolchains/src/toolchains/linux-2.6/buildroot/toolchain_build_mipsel/mpfr --
enable-shared --disable-nls --enable-threads --disable-multilib --with-abi=32 --
with-tune=mips32
Thread model: posix
gcc version 4.2.3
蟹さんのときと同じで
newlib/libc/include/stdlib.h の __deprecated__を2行コメントアウト
newlib/libc/include/sys/_intsup.h の Unable to determineを2行コメントアウト
gccのバージョンが古いためか
libgloss/mips/crt0.Sの.gnu_attribute 4,0をコメントアウトが必要だった。
あと何故かコンパイル時にmakedoc.cのコンパイルのためにgccが必要になっていた。ところがconfigure時に/usr/bin/ccをgccとシンボリックリンクしておくとconfigureが暴走します。。。 configureにCC_FOR_BUILD=ccを付けて解決しました。
configureはいろいろ試して、こうしました。
% ./configure --target=mips --host=amd64 CFLAGS_FOR_TARGET="-fno-pic -mno-abicalls" CC_FOR_BUILD=cc
setjmpで固まるのでデバッグして、newlib/libc/machine/mips/setjmp.SのsetjmpとlongjmpのFPR_LAYOUTをコメントアウトしたら正常に動くようになりました。
テストプログラムはこんなです。
jmp_buf env;
printk("MORIMORI1");
if (setjmp(env) == 0) {
printk("MORIMORI2");
longjmp(env, 1);
} else {
printk("MORIMORI3");
}
_sbrkを作ってmallocのテストもした方が良いです。
long *ptr;
printk("MORIMORI1");
ptr = malloc(32);
printk("MORIMORI2");
pkgで入れたgcc6ではコンパイルできそうになかったので、あきらめました。
gcc492のportsを作って、FreeBSDのネイティブツールでビルドできるようにしました。gccはmips-gccですがarはmips-unknown-freebsd12.2-arになるので、configureに以下を追加する必要がありました。
ac_cv_path_AR_FOR_TARGET=mips-unknown-freebsd12.2-ar ac_cv_path_RANLIB_FOR_TARGET=mips-unknown-freebsd12.2-ranlib
newlibはmakeの中でもconfigureを実行しているような感じがしますし、configureを二度かけると挙動が違ったり、なんだか変です。
newlibはgccのコンフィグレーションごとのライブラリを作ります。mipsの場合デフォルトはビックエンディアンですが、リトルエンディアンもサポートしているgccの場合はelというディレクトリにライブラリが作られます。
arm編
armel用にnewlib-3.0.0.20180831をビルドしてみました。armのgcc4はFreeBSDのpkgで用意されていたので、それを使います。上で書いていたdocのgccも問題も解決しました。
% ./configure --disable-newlib-supplied-syscalls --target=arm-none-eabi --host=amd64 CC_FOR_BUILD=cc
% gmake
こちらは修正無しに通りました。