如何构建旧版本的 gcc?找不到 crti.o 的错误

如何构建旧版本的 gcc?找不到 crti.o 的错误

如何在 Ubuntu 11.10 上构建旧版 gcc(具体来说,4.5.2)并避免出现“/usr/bin/ld:找不到 crti.o:没有此文件或目录”的错误?

我进行了一些挖掘并发现了几个类似的项目,但没有一个能够真正解决我的问题:

  • 我已经确认我的所有软件包(libc6-dev 等)都已重新安装这个问题
  • 我已经验证 crti.o 存在于 /usr/lib32 和 /usr/lib/x86_64-linux-gnu 中,并且我的 ld.so.conf 配置为查找这些目录
  • 我已经验证在 make 调用前添加 LIBRARY_PATH=/usr/lib/x86_64-linux-gnu 是可行的,但我想避免这种情况(它会成为 makefile 中的分歧点)
  • 我尝试使用 --with-build-sysroot 进行各种操作,但都没有成功(阅读:也许我只是不知道要设置正确的标志)
  • 当使用 strace 运行时(按照这个答案),我可以看到对 crti.o 的裸引用:

    13240 open("crti.o", O_RDONLY) = -1 ENOENT (没有此文件或目录)

谢谢!

答案1

即使是新版本的 GCC 也会因该消息而失败。这是因为新的 Debian/Ubuntu 版本(将)支持多架构(即在一个文件系统中为多台机器安装二进制文件),因此库已从标准位置移开。

有 GCC 补丁可以修复此问题这里(尚未批准最终版本,但适用于 Ubuntu),并且它们可能无需太多努力就可以应用于较旧的 GCC。我认为您需要使用以下配置 GCC--enable-multiarch, 或者其他的东西。

与此同时,创建软链接是一个很好的解决办法:

cd /usr/lib
ln -s x86_64-linux-gnu/crt*.o .

(32 位安装中文件夹名称会有所不同)。

希望有所帮助。

答案2

我也遇到了同样的问题。创建从 到 的符号链接/usr/libs/crt?.o/usr/lib/x86_64-linux-gnu/crt?.o我解决了这个问题。

答案3

我通过一些可能对您有用的解决方法解决了这个问题。

首先,用 构建 GCC LIBRARY_PATH=/usr/lib/x86_64-linux-gnu,以便构建引导过程知道在哪里找到crt?.o启动文件。

然后,您可以将这三个文件符号链接到可执行文件安装目录对应的目录中,而不是在影响整个系统的地方创建符号链接crt?.o。这实际上几乎位于启动文件的搜索路径的顶部,因此它会找到它们 - 但它们不会影响其他任何东西。/usr/lib${prefix}/lib/gcc/...${prefix}/bingcc

就我而言,放置它们的特定目录是lib/gcc/x86_64-unknown-linux-gnu/4.3.2/;您可以找到正确的目录,因为它crtbegin.o里面已经有其他类似的文件。

答案4

我在 Ubuntu precise x86_64 上构建了 GCC 4.1.2。和你一样,我查看了最后一个命令“xgcc”的 strace,寻找 32 位 c 运行时,grep-ped /32/ 如下。我的 C 运行时位于 /usr/lib32 中,由 libc6-dev-i386 包提供。

fgrep /32/ strace-output.txt | grep /usr/lib | head -1
access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32/crti.o", R_OK) = -1 ENOENT (No such file or directory)

因此,我在 xgcc 查找的目录中创建了 crt?.o 符号链接。

sudo mkdir -p /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
cd /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
sudo ln -s /usr/lib32/crt1.o 
sudo ln -s /usr/lib32/crtn.o 
sudo ln -s /usr/lib32/crti.o 

我用它成功地构建了 GCC 4.1.2。

相关内容