LoginSignup
1
1

More than 1 year has passed since last update.

newlibのコンパイル

Last updated at Posted at 2018-11-30

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

こちらは修正無しに通りました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1