如何使链接器不排除未调用的函数?

时间:2015-06-05 13:34:40

标签: c++ linux gcc linker ld

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

这在技术上是一种黑客攻击,但它简单易用。

答案 1 :(得分: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;
}