使用函数指针消除gcc死代码

时间:2014-10-28 20:32:32

标签: c gcc dead-code

我对链接器如何对未使用的函数和数据段进行死代码消除进行了原始的理解。如果你使用正确的编译器和链接器标志,它将每个函数和数据成员放入它自己的部分,然后当链接器链接它们时,它将看到,如果没有直接引用,没有链接到该部分,然后它将不会链接那部分进入最后的精灵。

我正在尝试协调如何使用函数指针。例如,您可以使用一个函数指针,其值基于用户输入。可能不安全,但编译器和链接器将如何处理?

1 个答案:

答案 0 :(得分:3)

没有可移植的方法来分配函数指针而不对函数进行显式引用(例如,您不能在函数指针上使用指针算法)。

因此,程序中可以访问的每个函数也必须在代码中进行命名和引用,链接器才能知道它。甚至将函数指针存储在数组中,如:

typedef void (*Callback)();
Callback callbacks[] = { foo, bar, baz };

足以确保列出的函数将包含在链接的可执行文件中(数组内容将在加载时或链接时修复,具体取决于平台)。