4

私は、ローカル マシン上で動作する gcc クロス コンパイラを作成しようとしています [Darwin new-host-2.home 10.7.4 Darwin Kernel Version 10.7.4: Mon Apr 18 21:24:17 PDT 2011; root:xnu-1504.14.12~3/RELEASE_X86_64 x86_64] であり、FreeBSD 8.2 x86_64 (FreeBSD 用語では AMD64) ターゲットを対象としています。

gcc 4.3.1、binutils 2.19、GMP 4.2.3、MPFR 2.3.2 をコンパイルしています。

問題が発生している可能性があることがいくつか見られますが、それらはニシンである可能性があります。価値があるのは、既知の作業スクリプトを使用してクロス コンパイラを構築し、単純にそれらを x86_64 アーキテクチャで動作させようとしているからです。

gcc コンパイラ ターゲット "x86_64-pc-freebsd7" を使用していますが、これは正しいようです。次のコンパイラ フラグを使用し、次compilerConfigureFlags="--enable-version-specific-runtime-libs --enable-shared --enable-threads=posix --disable-checking --disable-libunwind-exceptions --with-system-zlib --enable-__cxa_atexit"を使用して binutils を構成します。"--enable-64-bit-bfd"

私の最後のエラーで。私の注意を引くのは「-m32」で、そこにあるべきかどうかわかりません。エラーは、-lc を検索するときに、「互換性のない」ファイル /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/lib/libc.a をld が理解できないためです。. fileFreeBSD ボックスから libc.a と libc.soを実行すると、次のようになります。

sh-3.2# ファイル /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/lib/libc.a/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/ x86_64-pc-freebsd7/lib/libc.a: 現在の ar アーカイブ
sh-3.2# ファイル /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/lib/libc.so /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/ x86_64-pc-freebsd7/lib/libc.so: ELF 64 ビット LSB 共有オブジェクト、x86-64、バージョン 1 (FreeBSD)、動的にリンク、ストリップ

私のビルドが死ぬ最終行:

o _floatundidf_s.o _floatundixf_s.o _floatunditf_s.o _divdi3_s.o _moddi3_s.o _udivdi3_s.o _umoddi3_s.o _udiv_w_sdiv_s.o _udivmoddi4_s.o unwind-c_s.o emutls_s.o -lc && rm -f ./libgcc_s.so && if [ -f ./libgcc_s.so.1 ]; 次に mv -f ./libgcc_s.so.1 ./libgcc_s.so.1.backup; そうでなければ真。fi && mv ./libgcc_s.so.1.tmp ./libgcc_s.so.1 && ln -s libgcc_s.so.1 ./libgcc_s.so /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/ x86_64-pc-freebsd7/bin/ld: -lc /Developer/Cocotron の検索時に、互換性のない /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/lib//libc.so をスキップします/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/bin/ld: 非互換スキップ /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/lib/ libc.

このバージョンの「ld」を実行すると、次の出力が得られるため、ld が処理できないことに驚いています。

/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/bin/ld: サポート対象: elf64-x86-64-freebsd elf32-i386-freebsd coff-i386 efi-app-ia32 efi-bsdrv-ia32 efi-rtdrv-ia32 efi-app-x86_64 efi-bsdrv-x86_64 efi-rtdrv-x86_64 elf32-i386 elf64-x86-64 elf64-little elf64-big elf32-little elf32-big srec シンボルrec tekhex バイナリ ihex /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/bin/ld: サポートされているエミュレーション: elf_x86_64_fbsd elf_i386_fbsd elf_x86_64 elf_i386 /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1 /x86_64-pc-freebsd7/bin/ld: エミュレーション固有のオプション: elf_x86_64_fbsd:

これは、binutils を正しくビルドしたことを示しています..それでも、ELF 64 ビット x86-64 FreeBSD 共有オブジェクトであるライブラリを処理できませんか??

最初から話をすると、binutils のコンパイルは完璧なようです。

GMP と MPFR の両方をコンパイルすると、ranlib の問題が発生し、.a ライブラリを構築しようとすると、.o ファイルにシンボルがありません..これは正常かもしれませんが、わかりませんか?

GMP:

/usr/bin/ranlib: ファイル: .libs/libprintf.a(obprintf.o) にはシンボルがありません
/usr/bin/ranlib: ファイル: .libs/libprintf.a(obvprintf.o) にはシンボルがありません
/usr/bin/ranlib: ファイル: .libs/libprintf.a(obprntffuns.o) にはシンボルがありません
/usr/bin/ranlib: ファイル: .libs/libprintf.a(repl-vsnprintf.o) にはシンボルがありません
ranlib .libs/libprintf.a
ranlib: ファイル: .libs/libprintf.a(obprintf.o) にシンボルがありません
ranlib: ファイル: .libs/libprintf.a(obvprintf.o) にはシンボルがありません
ranlib: ファイル: .libs/libprintf.a(obprntffuns.o) にはシンボルがありません
ranlib: ファイル: .libs/libprintf.a(repl-vsnprintf.o) にはシンボルがありません

そして、私はさらに先に進みます..

ranlib /開発者/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libgmp.a
ranlib: ファイル: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libgmp.a(mp_clz_tab.o) にはシンボルがありません
ranlib: ファイル: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libgmp.a(obprintf.o) にはシンボルがありません
ranlib: ファイル: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libgmp.a(obvprintf.o) にはシンボルがありません
ranlib: ファイル: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libgmp.a(obprntffuns.o) にはシンボルがありません
ranlib: ファイル: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libgmp.a(repl-vsnprintf.o) にはシンボルがありません

MPFR:

同様の取引:

/usr/bin/ranlib: ファイル: .libs/libmpfr.a(volatile.o) にはシンボルがありません /usr/bin/ranlib: ファイル: .libs/libmpfr.a(mp_clz_tab.o) にはシンボルがありません /usr/bin/ranlib: ファイル: .libs/libmpfr.a(logging.o) にはシンボルがありません /usr/bin/ranlib: ファイル: .libs/libmpfr.a(set_d64.o) にはシンボルがありません /usr/bin/ranlib: ファイル: .libs/libmpfr.a(get_d64.o) にはシンボルがありません ranlib .libs/libmpfr.a ranlib: ファイル: .libs/libmpfr.a(volatile.o) にはシンボルがありません ranlib: ファイル: .libs/libmpfr.a(mp_clz_tab.o) にはシンボルがありません ranlib: ファイル: .libs/libmpfr.a(logging.o) にシンボルがありません ranlib: ファイル: .libs/libmpfr.a(set_d64.o) にはシンボルがありません ranlib: ファイル: .libs/libmpfr.a(get_d64.o) にはシンボルがありません libmpfr.la の作成

そして、もう少し先..

ranlib /開発者/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a ranlib: ファイル: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(volatile.o) にはシンボルがありません ranlib: ファイル: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(mp_clz_tab.o) にはシンボルがありません ranlib: ファイル: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(logging.o) にはシンボルがありません ranlib: ファイル: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(set_d64.o) にはシンボルがありません ranlib: ファイル: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(get_d64.o) にはシンボルがありません

次に、GCC に進みます。おそらく、適切な binutils、GMP、および MPFR を使用します。しかし、最終的に gcc (具体的には libgcc) のビルド中に、ld リンク エラーが発生します。


その他の補足情報:

以下を使用して binutils をコンパイルします。

CFLAGS="-m32 -Wformat=0 -Wno-error=deprecated-declarations" $sourceFolder/binutils-$binutilsVersion/configure --prefix="$resultFolder" --target=$compilerTarget $binutilsConfigureFlags

ただし、-m64 に切り替えると、同じ問題が発生します。

CFLAGS="-m64 -Wformat=0 -Wno-error=deprecated-declarations" $sourceFolder/binutils-$binutilsVersion/configure --prefix="$resultFolder" --target=$compilerTarget $binutilsConfigureFlags

以下を使用して GMP と MPFR をコンパイルします。

ABI=32 $sourceFolder/gmp-$gmpVersion/configure --prefix="$resultFolder"

以下を使用して GCC をコンパイルします。

CFLAGS="-m32" $sourceFolder/gcc-$gccVersion/configure -v --prefix="$resultFolder" --target=$compilerTarget \ --with-gnu-as --with-gnu-ld --with-headers=$resultFolder/$compilerTarget/include \ --without-newlib --disable-multilib --disable-libssp --disable-nls --enable-languages="$enableLanguages" \ --with-gmp=$buildFolder/gmp-$gmpVersion --enable-decimal-float --with-mpfr=$resultFolder --enable-checking=release \ --enable-objc-gc \
$compilerConfigureFlags

これらすべてについて、私は以下を使用しています:

compilerTarget=x86_64-pc-freebsd7 compilerConfigureFlags="--enable-version-specific-runtime-libs --enable-shared --enable-threads=posix --disable-checking --disable-libunwind-exceptions --with-system-zlib --enable-__cxa_atexit " binutilsConfigureFlags="--enable-64-bit-bfd"


ちなみに、標準の FreeBSD 8.2 RELEASE amd64 である私のターゲット FreeBSD システムでは、ld は私のクロスコンパイルのものと非常によく似た機能を示します。実際、私のクロスコンパイル環境の ld は、実際のターゲットの ld が処理するもののスーパーセットを処理しているようです - 私が見ている非互換性なしで、どんなファイルも処理できるはずだと思います

ld: サポートされるターゲット: elf64-x86-64 efi-app-ia32 elf32-i386-freebsd srec symbolsrec tekhex バイナリ ihex ld: サポートされるエミュレーション: elf_i386_fbsd elf_x86_64_fbsd ld: エミュレーション固有のオプション: elf_i386_fbsd:

4

1 に答える 1

2

64 ビット ライブラリは、64 ビット オブジェクト コードにのみリンクできます。-m6464 ビットのオブジェクト コードをビルドする必要があり-m32、32 ビットのオブジェクト コードを生成します。

于 2011-06-01T22:17:37.447 に答える