【问题标题】:How to make linker not to exclude uncalled function?如何使链接器不排除未调用的函数?
【发布时间】:2015-06-05 13:34:40
【问题描述】:

如果我定义了一个函数但不调用它,函数将不会以可执行文件的形式呈现。但是有些情况我们需要告诉链接器不要排除一个函数。例如,我定义了应该由totalview 调试器在调试时调用的函数。

如果我从某个地方(例如从 main 函数)调用该函数,问题将得到解决,它不会被排除,但是否有一般规则告诉链接器不要排除某个函数?

【问题讨论】:

  • 我想您要的是 GCC/ld,但您应该在问题中提及它。
  • 这不是重复的,因为这个问题涉及链接器而不是编译器的删除。
  • 听起来你需要一个链接器脚本。在那里,您可以更详细地定义链接器应包含在结果中的内容。
  • 听起来您或您的发行版已设置默认 GCC 标志以删除未使用的代码或使用 LTO 编译。通常 GCC 不会告诉链接器删除未使用的函数。要打开它,您通常需要使用 -ffunction-sections 和链接器选项 --gc-sections

标签: c++ linux gcc linker ld


【解决方案1】:

您可以使用 GCC 的属性externally_visible 来保证函数存在。

看起来像这样:

#include <stdio.h>

__attribute__((externally_visible))
int f(int x) {
        return x+2;
}

int main() {
        int x = f(2);
        printf("x=%d\n", x);
        return 0;
}

【讨论】:

    【解决方案2】:

    This question 处理了类似的问题,但它的重点是强制编译器包含一个函数,而不是链接器。

    不过,paxdiablo 的回答在这里仍然适用 - 您可以创建一个包含所有要包含的函数的全局数组。链接器不知道是否有人将该数组用作跳转表,因此它必须包含这些函数。 (一个真正聪明的链接器可能知道这个数组永远不会被访问,但是你可以更进一步,让一个函数访问这个数组,尽管那时它会变得很丑)。

    这是 paxdiablo 建议的代码,稍微重命名:

    void *functions_to_forceinclude[] = {
        &functionToForceIn,
        &anotherFunction
    };
    

    这在技术上是一种 hack,但它很简单且非常便携。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      相关资源
      最近更新 更多