删除 extern'd global 的死代码

Dead code removal of extern'd global

我想知道 compiler/linker 是否会删除在 public header 中 extern 的全局变量?例如:

// public.h
struct func_ptrs {
   void (*foo)(void);
   void (*bar)(int);
};

extern const struct func_ptrs DEFAULT_FUNCS;

和:

// private.c
#include "public.h"

void def_foo(void) { ... }
void def_bar(int a) { ... }

const struct func_ptrs DEFAULT_FUNCS = { .foo = def_foo, .bar = def_bar };

是否有任何特定的链接器标志允许从生成的二进制文件中删除此变量(和两个函数)?

假设 GCC 和 MSVC 是两个目标编译器。

DEFAULT_FUNCS:

由于符号 DEFAULT_FUNCS - 由于其范围和修饰符 - 可能会导出到二进制文件的符号 table 以进行(动态)链接,因此无法将其删除。换句话说:链接器 (ld) 无法确定这些符号是否会被使用。

函数 def_foo & def_bar

此外,根本没有可以剥离的函数,因为您只声明了它们。事实上,这个二进制文件的链接会失败,因为 def_foodef_bar 是未定义的符号。

还有一件事:正确的是:

const struct func_ptrs DEFAULT_FUNCS = ...

没有星号,因为您初始化的是结构,而不是指针。