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