Linux 链接器是否在静态链接文件中包含libc.so.6?

Linux 链接器是否在静态链接文件中包含libc.so.6?,linux,gcc,linker,Linux,Gcc,Linker,当我动态链接可执行elf文件时,它需要libc.so.6共享库。 当我静态链接可执行elf文件时,它不需要libc.so.6共享库(这并不奇怪) 这是否意味着,要用--static组装可执行文件,链接器中包含libc.so.6? 如果没有-链接器包含什么文件?我在哪里可以搜索它? 据我所知,链接器包括静态汇编文件中的静态库。链接器是ld命令。如果您使用该命令,它会按您的要求执行。请注意,GNUld可以接受 但是,大多数人都在使用gcc命令。这是套件中的编译器。实际上,gcc命令只是一个驱动程序,

当我动态链接可执行elf文件时,它需要libc.so.6共享库。 当我静态链接可执行elf文件时,它不需要libc.so.6共享库(这并不奇怪)

这是否意味着,要用--static组装可执行文件,链接器中包含libc.so.6? 如果没有-链接器包含什么文件?我在哪里可以搜索它?
据我所知,链接器包括静态汇编文件中的静态库。

链接器是
ld
命令。如果您使用该命令,它会按您的要求执行。请注意,GNU
ld
可以接受

但是,大多数人都在使用
gcc
命令。这是套件中的编译器。实际上,
gcc
命令只是一个驱动程序,它将运行
cc1
(正确的C编译器)、
as
ld
和(处理初始化等,然后调用链接器)

要了解gcc运行的确切命令,请将
-v
程序标志传递给它


当您将
-static
传递给
gcc
时,它可能会链接到例如
/usr/lib/x86\u 64-linux-gnu/libc.a
或gnu libc库的其他静态形式。

如果您以静态方式链接,链接器将链接静态库(
.a
)中所有需要的对象(
.o
)文件。例如,以下命令列出了libc6库中包含的对象文件:

ar t /usr/lib/libc.a
(当然,libc.a的确切路径因系统而异)

因此,您的问题的答案是否定的,它不会链接整个libc6库,而只链接所需的对象文件。而且,它对libc.so.6没有任何作用,因为它只用于动态链接。它与库的
libc.a
静态版本一起工作


根据@janneb comment,要链接的最小单位是“节”,因此它甚至可能不需要链接整个对象文件。

IIUC,节是可以链接的最小单位,而不是对象文件。例如,请参见GNU ld的--gc sections标志,以及gcc的-ffunction sections和-fdata sections选项。感谢您的回复。libc.a存储在哪里?即使在“find”的帮助下,我也找不到它。请尝试
find/-name“libc*.a”
以允许使用稍微不同的名称。你能静态链接吗?如果是的话,它一定在你系统的某个地方。我是在sudo find/-name“libc*\.a”的帮助下创建它的。感谢您的支持。:)太好了,@Lucky Man:-)你最终的发现途径是什么?谢谢你的回复。我找不到libc.a。原因是什么?您是否尝试运行
gcc-v-static-O helloworld.c-O helloworld
命令来查找?
libc.a
的精确位置是特定于系统(即发行版)的。静态链接的文件具有crtbegin.o,而非静态链接的文件具有crtbegin.o-在我的案例中,这是它们之间的唯一区别。