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',我不确定它是否应该在那里。该错误是因为 ld在搜索 -lc 时无法理解我的“不兼容”文件/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/lib/libc.a . 当我file从 FreeBSD 框中运行 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-dw2_s.o unwind-dw2-fde_s.o unwind-dw2-fde_s.o unwind-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/库。

我很惊讶 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 二进制 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。 /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 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

对于所有这些,我正在使用:

编译器目标=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:

4

1 回答 1

2

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

于 2011-06-01T22:17:37.447 回答