如果我定义了一个函数但没有调用它,函数将不会显示在可执行文件中。但是有些情况我们需要告诉链接器不要排除某个函数。例如,我已经定义了应该在调试时由totalview
调试器调用的函数。
如果我从某个地方调用该函数(例如从main函数调用),问题将被解决,它不会被排除,但有一般规则告诉链接器不要排除函数吗?
答案 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;
}