为什么GCC交叉编译不构建`crti.o`?

时间:2010-07-27 17:23:30

标签: gcc arm cross-compiling

在尝试为arm构建gcc 4.x.x交叉编译器时,我陷入了crti.o子目录中缺少的$BUILD_DIR/gcc文件。

顶级strace上的Makefile表示已编译的xgcc正在以ld作为参数调用交叉链接器"crti.o"。我假设如果调用交叉链接ld,则原生/usr/lib/crti.o不是所需的。

我可以看到在gcc源代码树中有一些crti对象的潜在来源(包括$SRC_DIR/gcc/config/arm/crti.asm)。

如何配置gcc构建以确保构建此文件(或从ld命令中省略)?

这是我的配置行:

/x-tools/build/gcc-4.5.0$ ../../src/gcc-4.5.0/configure --target=arm-linux --prefix=/opt/arm-tools --disable-threads --enable-languages=c

1 个答案:

答案 0 :(得分:4)

真正的答案是应该编译crti.o ,如果要构建一个arm-elf目标。 在构建一个 arm-linux 目标, gcc 人们合理地假设 glibc 已经被编译过,它将提供crti.o启动。完全合理, 如果您正在升级

构建一个新的根文件系统是另一个故事,一个矛盾的问题(首先是: glibc gcc ?)。一种方法(认可,但我还没有成功)是建立一个独立的 gcc arm-elf \ static,比如说)然后 glibc ,然后 gcc

似乎有些人通过修改crti.o解决了 arm-linux 目标中缺少的gcc\config\arm\t-linux。 kludge不是依赖于未发生的 glibc ,而是使用 arm-elf 提供的crti.o版本。可以找到一个示例here

--- gcc-3.4.4/gcc/config/arm/t-linux    2003-09-20 17:09:07.000000000 -0400
+++ gcc-3.4.4.works/gcc/config/arm/t-linux  2005-05-25 20:44:07.000000000 -0400
@@ -18,3 +18,24 @@

 # LIBGCC = stmp-multilib
 # INSTALL_LIBGCC = install-multilib
+
+EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crti.o crtn.o
+
+# If EXTRA_MULTILIB_PARTS is not defined above then define EXTRA_PARTS here
+# EXTRA_PARTS = crtbegin.o crtend.o crti.o crtn.o
+
+LIBGCC = stmp-multilib
+INSTALL_LIBGCC = install-multilib
+
+# Assemble startup files.
+$(T)crti.o: $(srcdir)/config/arm/crti.asm $(GCC_PASSES)
+   $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
+   -c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/arm/crti.asm
+
+$(T)crtn.o: $(srcdir)/config/arm/crtn.asm $(GCC_PASSES)
+   $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
+   -c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/arm/crtn.asm
+
+# Disable libc link
+
+SHLIB_LC =