【发布时间】:2020-10-06 02:53:32
【问题描述】:
编译gcc并使用它编译一个简单的c程序后:
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
grep -B4 '^ /usr/include' dummy.log
结果是:
ignoring nonexistent directory "/tools/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../x86_64-pc-linux-gnu/include"
ignoring duplicate directory "/tools/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/include
但根据Linux From Scratch guide 9.1 in section 6.25“验证编译器是否正在搜索正确的头文件:”以下是预期的(忽略 *linux-gnu 路径...):
#include <...> search starts here:
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include
/usr/local/include
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed
/usr/include
更糟糕的是
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
是:
SEARCH_DIR("/usr/lib");
但应该是:
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
我尝试将所有路径添加到 /etc/ld.so.conf 并重新编译 gcc pass 2,但没有任何改变。
那么究竟是什么决定了 ELF 文件中的 SEARCH_DIR 条目?
EDIT1:我回溯并发现上一步 make -k clean 没有完成,因为它缺少 autogen,这似乎在 LFS 指南 9.1 中根本没有涵盖。
【问题讨论】:
-
您的
grep模式搜索以空白开头并以/usr/include继续的行。只有一条这样的线路——据报道。您不会看到/usr/local/include,因为您的搜索排除了它(或没有选择它)。 -
您的
grep很好,这是书中正确的命令。这个想法是匹配行^ /usr/include,然后在它之前返回4行(即-B4)以验证正确的包含路径。您在这里的输出应该与书上所说的相符,直到它完成才继续。您将需要追溯您的步骤并找出您做错了什么。 linuxfromscratch.org/lfs/view/stable/chapter01/askforhelp.html 对不起,我帮不上忙,你可以试试邮件列表。 -
一个可能的原因...当您运行
chroot时,您是否将+h传递给bash以便关闭散列?这是似乎与您的问题相匹配的线程的结尾:lists.linuxfromscratch.org/pipermail/lfs-support/2008-July/… -
是的,为 chroot 做了 +h。感谢您提及帮助部分。
-
您是否将包含指令的搜索目录与库的搜索目录混淆了?它们是完全不同的概念。请澄清。
标签: c gcc ld elf linux-from-scratch