如何在 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}/bin
gcc
就我而言,放置它们的特定目录是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。