GCC 中的选择性链接是什么?

What is selective linking in GCC?

this 文章中,我发现了这一行:GNU 链接器使用选择性链接,它使其他未引用的函数远离链接器的输出映像。

我不确定这到底是什么意思。但我的想法是,如果我在我的源代码中包含 stdio.h,并且仅使用其中的 printf,那么生成的 exe 仅包含从 stdio.c 中提取的 printf 的代码以及该文件中定义的其他函数将被丢弃。

我说的对吗?如果不是,选择性链接是什么意思?另外,在上述情况下,编译器是包含整个文件,还是只包含使用的函数?

The GNU linker uses selective linking, which keeps other unreferenced functions out of the linker’s output image.

这仅在 linking .a 文件时适用。 .a 个文件是 .o 个文件的集合。 选择性 linking 意味着它 link 仅在一个函数中,而不是该函数所在的整个 .o

if I include stdio.h in my source code, and use only printf from that, then the resulting exe contains only code for printf extracted from stdio.c and other functions defined in that file are discarded.

C 标准库函数通常驻留在 libc.so 中,除非您显式静态 link。因此,要么你 link libc.a 并将 printf 函数复制到你的可执行文件中( 选择性 linking),要么你 link libc.so 并且没有制作 printf 的副本。

stdio.c 仅用于构建 libc.alibc.so.


正如@JohannesSchaub-litb 在评论中提到的那样:

    编译 .o 文件时需要
  • -ffunction-sections 以利用 选择性 linking linker 功能:

Together with a linker garbage collection (linker --gc-sections option) these options may lead to smaller statically-linked executables (after stripping).

  • --gc-sections linker 选项启用 选择性 linking:

--gc-sections decides which input sections are used by examining symbols and relocations. The section containing the entry symbol and all sections containing symbols undefined on the command-line will be kept, as will sections containing symbols referenced by dynamic objects. Note that when building shared libraries, the linker must assume that any visible symbol is referenced.