在尝试为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
答案 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 =