/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位。
答案 0 :(得分:4)
当然你可以使用64位操作系统,编译器和链接器从源代码构建gcc为32位。问题绝对不是“ld”。
你做的正确:在CFLAGS和LDFLAGS中指定“-m32”。
问题是build/gengenrtl.o
和build/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 ++编译器。