1
/usr/bin/ld: i386:x86-64 architecture of input file `build/gengenrtl.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `build/errors.o' is incompatible with i386 output
/usr/bin/ld: build/gengenrtl.o: file class ELFCLASS64 incompatible with ELFCLASS32
/usr/bin/ld: final link failed: File in wrong format
collect2: error: ld returned 1 exit status

我不知道是问题ld还是给定的库。

我的配置是

 CC="gcc -m32" \
 CFLAGS="-m32" \
 LD="<path>/bin/32/binutils/2.23.2/bin/ld" \
 LDFLAGS="-m32" \
 ./configure \
 --build=i586-pc-linux-gnu \
 --host=i586-pc-linux-gnu \
 --target=i586-pc-linux-gnu \
 --enable-shared \
 --enable-static \
 --enable-languages=c,c++ \
 --enable-bootstrap \
 --prefix=<path>/bin/32/gcc/i586 \
 --disable-stage1-checking \ 
 --with-gmp=<path>/lib/32/gmp/5.1.2 \
 --with-mpfr=<path>/lib/32/mpfr/3.1.2 \
 --with-mpc=<path>/lib/32/mpc/1.0.1 \
 --with-cloog=<path>/lib/32/cloog/0.18.0 \
 --without-ppl

显然我不能这么容易地更改 ld 可执行文件,gcc 一直在使用 global system 进行编译/usr/bin/ld

有人可以说这里发生了什么以及如何解决这个链接阶段?

我在 Ubuntu 64 位下,我正在尝试编译 gcc 的 32 位版本,当然我已经编译了 32 位的 gmp、mpc、mpfr。

4

2 回答 2

4

当然您可以使用 64 位操作系统、编译器和链接器从源代码构建 32 位 gcc。问题绝对不是“ld”。

您正在做完全正确的事情:在 CFLAGS 和 LDFLAGS 中指定“-m32”。

问题是build/gengenrtl.o并且build/errors.o似乎是为 64 位(而不是 32 位)构建的。

建议:

1)检查makefile,并检查您的构建日志。看看这两个文件的构建命令是否有任何“不同”。

2) 使用“nm”命令验证您的 *.o 目标文件的其余部分是否正确构建为 32 位 - 只有“gengenrtl.o”和“errors.o”(错误地)构建为 ELFCLASS64。

'希望有帮助...

于 2013-08-15T22:51:54.403 回答
1

我已经解决了类似的问题(在 amd64 上编译 gcc,在 i686 上运行,目标是 mips),并添加以下命令来制作命令行:

CC="gcc -m32" CXX="g++ -m32" LDFLAGS=-m32

无需指定 ld 的完整路径。但是您忘记指定使用哪个 C++ 编译器。

于 2018-05-16T15:57:58.227 回答