【发布时间】:2019-12-08 02:48:57
【问题描述】:
如果我做gcc hello_world.c,gcc/ld 怎么知道应该链接到的是libc.so.6? gcc/ld 是否通过默认的共享库路径(但是配置了链接器,加上一些 gcc 额外的风格),然后扫描每个 .so 文件的符号表?
【问题讨论】:
标签: c linux gcc compilation linker
如果我做gcc hello_world.c,gcc/ld 怎么知道应该链接到的是libc.so.6? gcc/ld 是否通过默认的共享库路径(但是配置了链接器,加上一些 gcc 额外的风格),然后扫描每个 .so 文件的符号表?
【问题讨论】:
标签: c linux gcc compilation linker
它没有。除非您使用-nostdlib,否则-lc 位于GCC 传递给链接器以获取链接命令的默认库中。对于其他库,您需要在链接时明确请求它们。
【讨论】:
-lc 不是图书馆。它是一个命令行开关。它告诉链接器查找名为libc.something 的文件。它查找它的路径和something 的可能值要么内置在链接器中,要么在构建时配置,除非被环境变量或开关修改。
-lc 是图书馆。是否存在任何此类文件是实现定义的。对于 gcc,是的,但无论如何我认为这是谈论这种情况的合理方式。
-lc 中,“c”是库的名称(第 211 页)。但它不是图书馆。那里有一句话说“链接器搜索库的标准目录列表”。所以这个库实际上是某个目录中的一个文件。此外,问题还询问gcc 或ld 如何知道应该链接到libc.so.6。默认情况下,gcc,当链接它知道从 C 源派生的对象时,传递 -lc 或与链接器等效的一些东西。链接器具有它搜索的标准系统目录和扩展名的列表,...
.so.6 的.6 部分。我希望链接器搜索.so 文件,但我不知道它的搜索是否会直接包含.so.6 文件,或者链接器会以某种方式找到它,因为它在其他文件中被引用。 (例如,引用 libc.so.6 的 libc.so 存根。)