在64位上从源构建32位GCC:链接问题

时间:2013-08-15 22:42:11

标签: gcc configuration linker ld

/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继续使用全局系统/usr/bin/ld进行编译。

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

我在Ubuntu 64位下,我正在尝试编译一个32位构建的gcc,当然我已经编译了gmp,mpc,mpfr为32位。

2 个答案:

答案 0 :(得分:4)

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

你做的正确:在CFLAGS和LDFLAGS中指定“-m32”。

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

SUGGESTIONS:

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

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

'希望有所帮助......

答案 1 :(得分:0)

我已经解决了类似的问题(Compile gcc on amd64, for running on i686, and target is mips),并在make命令行中添加了以下内容:

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

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