构建交叉编译64位GCC失败。

4
我正在尝试创建一个工作的gcc交叉编译器,它位于我的本地机器上(Darwin new-host-2.home 10.7.4 Darwin kernel版本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",并使用"--enable-64-bit-bfd"配置binutils。在我的最后一个错误中,有一些引起我的注意的东西是'-m32',我不确定它是否应该在那里。错误是因为ld在搜索-lc时无法理解我的“不兼容”文件/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/lib/libc.a。当我对来自FreeBSD框的libc.a和libc.so运行file时,我得到:
sh-3.2#file / 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:current ar archive
sh-3.2#file /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-bit LSB shared object,x86-64,version 1(FreeBSD),dynamically linked,stripped
我的构建最后一行失败了:
/Developer/Cocotron/1.0/build/FreeBSD/x86_64/gcc-4.3.1/./gcc/xgcc -B/Developer/Cocotron/1.0/build/FreeBSD/x86_64/gcc-4.3.1/./gcc/-B/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/bin/-B/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/lib/-isystem /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/include-isystem /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/sys-include-O2 -O2 -g -m32-DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -DNATIVE_CROSS-W -Wall -Wwrite-strings -Wstrict-prototypes-Wmissing-prototypes -Wold-style-definition-isystem ./include-fPIC -pthread -g-DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED-shared-nodefaultlibs-Wl,--soname=libgcc_s.so.1-Wl,--version-script=libgcc.map-o ./libgcc_s.so.1.tmp-O2 -g -m32 -B./_muldi3_s.o _negdi2_s.o_lshrdi3_s.o _ashldi3_s.o _ashrdi3_s.o_cmpdi2_s.o _ucmpdi2_s.o _clear_cache_s.o_enable_execute_stack_s.o _trampoline_s.o __main_s.o_absvsi2_s.o _absvdi2_s.o _addvsi3_s.o_addvdi3_s.o _subvsi3_s.o _subvdi3_s.o_mulvsi3_s.o _mulvdi3_s.o _negvsi2_s.o_negvdi2_s.o _ctors_s.o _ffssi2_s.o_ffsdi2_s.o _clz_s.o _clzsi2_s.o_clzdi2_s.o _ctzsi2_s.o _ctzdi2_s.o_popcount_tab_s.o _popcountsi2_s.o_popcountdi2_s.o _paritysi2_s.o _paritydi2_s.o_powisf2_s.o _powidf2_s.o_powixf2_s.o _powitf2_s.o_mulsc3_s.o _muldc3_s.o _mulxc3_s.o_multc3_s.o _divsc3_s.o_divdc3_s.o _divxc3_s.o _divtc3_s.o_bswapsi2_s.o _bswapdi2_s.o_fixunssfsi_s.o_fixunsdfsi_s.o _fixunsxfsi_s.o _fixsfdi_s.o_fixdfdi_s.o _fixxfdi_s.o _fixtfdi_s.o_fixunssfdi_s.o _fixunsdfdi_s.o _fixunsxfdi_s.o_fixunstfdi_s.o _floatdisf_s.o_floatdidf_s.o _floatdixf_s.o _floatditf_s.o_floatundisf_s.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. unwind-dw2_s.o unwind-dw2-fde_s.o unwind-sjlj_s.ogthr-gnat_s.o unwind-c_s.o emutls_s.o-lc && rm -f ./libgcc_s.so && if [ -f ./libgcc_s.so.1 ]; then mv -f./libgcc_s.so.1 ./libgcc_s.so.1.backup; else true; 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: 跳过不兼容文件 /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
我很惊讶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 symbolsrec tekhex binary 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 /Developer/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 /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a`时出现了错误:文件`/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(volatile.o)`、`/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(mp_clz_tab.o)`、`/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(logging.o)`、`/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(set_d64.o)`、`/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(get_d64.o)`没有符号。

然后我们开始编译GCC,假设已经具有良好的binutils,GMP和MPFR...但最终在构建GCC(特别是libgcc)期间,我遇到了链接失败的问题。


一些更多的支持信息:

我使用以下命令编译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系统上(顺便提一下,它是标准的FreeBSD 8.2 RELEASE amd64),ld显示了与我的交叉编译环境非常相似的功能。事实上,似乎我的交叉编译环境的ld处理了目标实际的ld处理的超集 - 这让我认为我应该能够处理任何文件,而不会出现不兼容性。

ld: 支持的目标:elf64-x86-64 efi-app-ia32 elf32-i386-freebsd srec symbolsrec tekhex binary ihex ld: 支持的仿真:elf_i386_fbsd elf_x86_64_fbsd ld: 仿真特定选项: elf_i386_fbsd:


你是对的,-m32 是错误的。32位目标代码和64位库不能链接在一起。 - Gunther Piez
@drhirsch 把它变成一个答案,这样我就可以接受了。我已经让它工作了,原因是我需要使用-m64,并且在编译GMP和MPFR时还需要设置ABI=64。 - Nektarios
谢谢,我不确定,所以我先加了注释。 - Gunther Piez
1个回答

2

64位库只能链接到64位目标代码。您需要使用-m64来构建64位目标代码,-m32会生成32位目标代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接