【问题标题】:How does gcc on Linux know it is libc.so.6 that contains printf function?Linux 上的 gcc 如何知道包含 printf 函数的是 libc.so.6?
【发布时间】:2019-12-08 02:48:57
【问题描述】:

如果我做gcc hello_world.cgcc/ld 怎么知道应该链接到的是libc.so.6gcc/ld 是否通过默认的共享库路径(但是配置了链接器,加上一些 gcc 额外的风格),然后扫描每个 .so 文件的符号表?

【问题讨论】:

    标签: c linux gcc compilation linker


    【解决方案1】:

    它没有。除非您使用-nostdlib,否则-lc 位于GCC 传递给链接器以获取链接命令的默认库中。对于其他库,您需要在链接时明确请求它们。

    【讨论】:

    • 这没有回答问题。 -lc 不是图书馆。它是一个命令行开关。它告诉链接器查找名为libc.something 的文件。它查找它的路径和something 的可能值要么内置在链接器中,要么在构建时配置,除非被环境变量或开关修改。
    • @EricPostpischil:正式地,-lc 是图书馆。是否存在任何此类文件是实现定义的。对于 gcc,是的,但无论如何我认为这是谈论这种情况的合理方式。
    • Formally,在-lc 中,“c”是库的名称(第 211 页)。但它不是图书馆。那里有一句话说“链接器搜索库的标准目录列表”。所以这个库实际上是某个目录中的一个文件。此外,问题还询问gccld 如何知道应该链接到libc.so.6。默认情况下,gcc,当链接它知道从 C 源派生的对象时,传递 -lc 或与链接器等效的一些东西。链接器具有它搜索的标准系统目录和扩展名的列表,...
    • ... 这些列表取决于目标平台和用于构建 GNU 工具的设置。我会回答这个问题,除非我不知道.so.6.6 部分。我希望链接器搜索.so 文件,但我不知道它的搜索是否会直接包含.so.6 文件,或者链接器会以某种方式找到它,因为它在其他文件中被引用。 (例如,引用 libc.so.6libc.so 存根。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2019-01-03
    • 2018-11-08
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多