mts交叉编译器中的crt1.o错误

时间:2014-10-04 23:23:09

标签: linux gcc mips cross-compiling crt

我想在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的源代码来生成交叉编译器。

2 个答案:

答案 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/。例如,这里SYSROOTarm-linux-gnueabi(即arm-linux-gnueabi-gccarm-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和您的目标架构一起使用。