【问题标题】:gcc compiles ELF file with wrong search listgcc 使用错误的搜索列表编译 ELF 文件
【发布时间】: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


【解决方案1】:

我重新启动了 LFS 9.1 并更加小心地按照说明进行操作,现在输出符合预期!

我做了两件事不同:

  1. 在我的第一次尝试中,我忽略了 chapter 5 上的建议,即在每个部分之后删除提取的 tarball:

对于每个包:

  1. 使用 tar 程序,解压要构建的包。在第 5 章中,解压包时请确保您是 lfs 用户。

  2. 切换到解压包时创建的目录。

  3. 按照书中的说明构建包。

  4. 切换回源目录。

  5. 除非另有说明,否则请删除提取的源目录。

  1. 当我重新安装主机操作系统时,我没有使用 lfs 作为第一个用户来创建它。相反,我使用 lfshost 用户创建了它,并按照section 4.3 中的描述创建了用户 lfs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多