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

4
为了构建一个针对arm的gcc 4.x.x交叉编译器,我卡在了$BUILD_DIR/gcc子目录中缺少crti.o文件的问题上。
在顶层Makefile上执行strace命令后,发现已编译的xgcc正调用交叉链接器ld,并将crti.o作为参数传递。我猜测,如果调用交叉链接器ld,则本地/usr/lib/crti.o并不是所需文件。
我可以看到,在gcc源代码树中有许多可能来源于crti对象的源代码(包括$SRC_DIR/gcc/config/arm/crti.asm)。
如何配置gcc构建以确保构建此文件(或从ld命令中省略此文件)?
这是我的configure命令行:
/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

你是否已经安装了glibc-devel? - SiggyF
1
是的,但你认为这会有帮助吗?被调用的链接器是交叉链接器,因此使用本地加载器库是不正确的。 - Jamie
crti.o 是一个 C 库的东西,而不是编译器的东西。引导程序、链接脚本等也不属于工具链的范畴。你需要额外的东西来补充工具链,比如针对交叉工具可以找到的目标的 glibc。 - old_timer
1个回答

4
真正的答案是,如果要构建一个arm-elf目标,则应该编译crti.o。在构建一个arm-linux目标时,gcc的人们合理地假设glibc已经被先前编译过,并且它将提供crti.o启动。如果你正在升级,这是完全合理的。
构建一个新的根文件系统是另一回事,而且是个自相矛盾的故事(哪个先来:glibc还是gcc?)。一种方法(得到认可,但我还没有成功)是首先构建一个独立的gcc(比如arm-elf/static),然后是glibc,最后再是gcc。
似乎有些人已经通过修改gcc\config\arm\t-linux来解决在arm-linux目标中缺少crti.o的问题。与其依赖不存在的glibc,这种方法是使用arm-elf提供的版本crti.o。可以在这里找到一个示例。
--- 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 =

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接