我想在x86机器上使用gcc生成MIPS二进制文件。为了安装MIPS交叉编译器,我按照this page上的说明进行操作。我可以成功安装gcc和binutils。我试图使用交叉编译器编译一个简单的hello world程序。
/opt/cross/bin/mipsel-unknown-linux-gnu-gcc -mips1 hi.c
我收到了以下错误。
/opt/cross/lib/gcc/mipsel-unknown-linux-gnu/4.8.2/../../../../mipsel-unknown-linux-gnu/bin/ld: cannot find crt1.o: No such file or directory
/opt/cross/lib/gcc/mipsel-unknown-linux-gnu/4.8.2/../../../../mipsel-unknown-linux-gnu/bin/ld: cannot find crti.o: No such file or directory
/opt/cross/lib/gcc/mipsel-unknown-linux-gnu/4.8.2/../../../../mipsel-unknown-linux-gnu/bin/ld: cannot find -lc
/opt/cross/lib/gcc/mipsel-unknown-linux-gnu/4.8.2/../../../../mipsel-unknown-linux-gnu/bin/ld: cannot find crtn.o: No such file or directory
collect2: error: ld returned 1 exit status
我在网上做了一些研究,找出问题所在,并将我用过的命令改为以下内容。
/opt/cross/bin/mipsel-unknown-linux-gnu-gcc -B/usr/lib/i386-linux-gnu -mips1 hi.c
现在我收到此错误消息:
/opt/cross/lib/gcc/mipsel-unknown-linux-gnu/4.8.2/../../../../mipsel-unknown-linux-gnu/bin/ld: /usr/lib/i386-linux-gnu/crt1.o: Relocations in generic ELF (EM: 3)
/usr/lib/i386-linux-gnu/crt1.o: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
我不确定问题是什么。我唯一能想到的是在构建gcc时传递给配置程序的“--without-headers”选项。在linux-mips页面上给出的gcc配置命令如下。
% ../gcc-3.8.2/configure --target=$TARGET --prefix=$PREFIX \
--enable-languages=c --without-headers \
--with-gnu-ld --with-gnu-as \
--disable-shared --disable-threads \
--disable-libmudflap --disable-libgomp \
--disable-libssp --disable-libquadmath \
--disable-libatomic
我很感激一些帮助。我生成交叉编译器的系统使用gcc4.7.2-5。我使用gcc-4.8.2和binutils-2.24的源代码来生成交叉编译器。
答案 0 :(得分:2)
/ opt / cross / bin / mipsel-unknown-linux-gnu-gcc -mips1 hi.c
在编译命令中添加SYSROOT
。它看起来应该类似于:
/opt/cross/bin/mipsel-unknown-linux-gnu-gcc -mips1 --sysroot=/opt/cross/... hi.c
SYSROOT
会自动提供标题和库路径(而不是单独添加-I
和-L
。
您知道何时有SYSROOT
,因为所使用的路径中会有bin/
,include/
和lib/
。例如,这里SYSROOT
为arm-linux-gnueabi
(即arm-linux-gnueabi-gcc
和arm-linux-gnueabi-g++
):
$ ls /usr/arm-linux-gnueabi
bin include lib
因此,在此示例中,您将使用--sysroot=/usr/arm-linux-gnueabi
。
如果您需要有关查找SYSROOT
的帮助,请执行find
:
$ find /usr -name crt1.o
/usr/arm-linux-gnueabi/lib/crt1.o
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o
/usr/lib/x86_64-linux-gnu/crt1.o
在您的情况下,您可能会从/opt/cross
进行搜索。显然,你想要一个目标(arm-linux-gnueabi
),而不是主机(x86_64-linux-gnu
)。
答案 1 :(得分:0)
添加--sysroot =会解决此问题。 在进行交叉编译时,您不应该选择任何其他具有crt1.o或crtX.o作为sysroot目录的文件夹。它可能是您的主机文件。 (如果你在x86上运行,那将是x86)。它再次从32位和64位不等。
对于较新版本的GCC工具链,你需要有一个sdk部分,它有适当的sysroot和crt1.o.这应该与您的ABI和您的目标架构一起使用。