我对链接器如何消除未使用的函数和数据段的死代码有一个基本的了解。如果使用正确的编译器和链接器标志,它会将每个函数和数据成员放入自己的节中,然后当链接器链接它们时,它会看到,如果没有直接引用,则没有任何链接到该节,然后它也不会将该节链接到最终的elf。
我正试图协调函数指针的工作方式。例如,您可以有一个函数指针,其值基于用户输入。这可能不是一件安全的事情,但编译器和链接器将如何处理?
在不显式引用函数的情况下,没有可移植的方法来分配函数指针(例如,不能在函数指针上使用指针算术)。
因此,从你的程序中可以访问的每个函数也必须在代码中被命名和引用,链接器就会知道它
typedef void (*Callback)();
Callback callbacks[] = { foo, bar, baz };
足以确保列出的函数将包含在链接的可执行文件中(数组内容将在加载时或链接时固定,具体取决于平台)。