Linux上的gcc如何知道包含printf函数的是libc.so.6?
如果我做了Linux上的gcc如何知道包含printf函数的是libc.so.6?,c,linux,gcc,compilation,linker,C,Linux,Gcc,Compilation,Linker,如果我做了gcc hello_world.c,gcc/ld怎么知道应该链接的是libc.so.6?gcc/ld是否通过默认的共享库路径(但是链接器已配置,加上一些gcc附加样式),然后扫描每个文件的符号表?它没有。除非使用-nostlib,-lc在默认库中,GCC将传递给链接器以执行链接命令。对于其他库,您需要在链接时明确请求它们。这并不能回答问题-lc不是库。它是一个命令行开关。它告诉链接器查找名为libc.something的文件。除非被环境变量或开关修改,否则它查找它的路径和某物的可能值要
gcc hello_world.c
,gcc
/ld
怎么知道应该链接的是libc.so.6
?gcc
/ld
是否通过默认的共享库路径(但是链接器已配置,加上一些gcc
附加样式),然后扫描每个文件的符号表?它没有。除非使用-nostlib
,-lc
在默认库中,GCC将传递给链接器以执行链接命令。对于其他库,您需要在链接时明确请求它们。这并不能回答问题<代码>-lc
不是库。它是一个命令行开关。它告诉链接器查找名为libc.something的文件。除非被环境变量或开关修改,否则它查找它的路径和某物的可能值要么内置在链接器中,要么在构建链接器时进行配置。@EricPostpischil:正式地说,-lc
就是库。是否存在这样的文件由实现定义。对于gcc来说,是的,但无论如何,我认为这是一种合理的方式来谈论这种情况。在-lc
中,“c”是库的名称(第211页)。但这不是图书馆;那里有一句话说“链接器搜索库的标准目录列表”,所以库实际上是某个目录中的一个文件。此外,这个问题询问gcc
或ld
如何知道应该链接到的是libc.so.6
。默认情况下,gcc
,当链接它知道从C源派生的对象时,会将-lc
或一些等效的对象传递给链接器。链接器有它搜索的标准系统目录和扩展的列表,……这些列表取决于目标平台和构建GNU工具时使用的设置。我会回答这个问题,除非我不知道.so.6
的.6
部分。我希望链接器搜索.so
文件,但我不知道它的搜索是否会直接包括.so.6
文件,或者链接器会以某种方式找到它,因为它是在其他文件中引用的。(例如,一个libc.so
存根,它指的是libc.so.6
)。