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

Ash*_*hot 5 c++ linux linker gcc ld

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

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

Ebo*_*ike 1

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

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

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

void *functions_to_forceinclude[] = {
    &functionToForceIn,
    &anotherFunction
};
Run Code Online (Sandbox Code Playgroud)

这在技术上是一种黑客攻击,但它很简单并且非常便携。