【问题标题】:What is selective linking in GCC?什么是 GCC 中的选择性链接?
【发布时间】:2021-09-25 22:08:33
【问题描述】:

this 的文章中,我发现了这一行:GNU 链接器使用选择性链接,它将其他未引用的函数排除在链接器的输出图像之外。

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

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

【问题讨论】:

    标签: c gcc static-linking


    【解决方案1】:

    GNU 链接器使用选择性链接,它将其他未引用的函数排除在链接器的输出图像之外。

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

    如果我在源代码中包含stdio.h,并且只使用其中的printf,则生成的exe 仅包含从stdio.c 提取的printf 代码,并且该文件中定义的其他函数将被丢弃。

    C 标准库函数通常驻留在libc.so 中,除非您显式静态链接。因此,要么链接 libc.a 并将 printf 函数复制到可执行文件中(选择性链接),要么链接 libc.so 并且不复制 printf

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


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

    • 编译 .o 文件以利用 选择性链接 链接器功能时需要 -ffunction-sections

    与链接器垃圾收集(链接器--gc-sections 选项)一起,这些选项可能会导致更小的静态链接可执行文件(剥离后)。

    • --gc-sections 链接器选项启用选择性链接

    --gc-sections 通过检查符号和重定位来决定使用哪些输入段。将保留包含条目符号的部分和包含命令行上未定义符号的所有部分,以及包含动态对象引用的符号的部分。请注意,在构建共享库时,链接器必须假定引用了任何可见符号。

    【讨论】:

    • 我认为 .a 文件是整个 .o 文件,而不是不相关的 .o 文件。每个功能,真的吗?你不需要 gc-sections 和 function-sections 标志吗?
    • 在 gcc 上,默认情况下不启用 -ffunction-sections(我认为根据手册页),因为它有缺点。不过,在 ARM-Keil 上,这是默认设置。也许它对嵌入式有利。
    • @JohannesSchaub-litb 我对“并非不相关的 .o 文件”感到困惑。 .a 仅包含您放入其中的那些 .o
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2018-10-22
    • 1970-01-01
    • 2021-07-09
    相关资源
    最近更新 更多