删除extern'd全局的死代码

时间:2016-01-20 21:32:19

标签: c c99 dead-code

我想知道编译器/链接器是否会删除公共头中已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是两个目标编译器。

1 个答案:

答案 0 :(得分:0)

<强> DEFAULT_FUNCS:

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

功能def_foo&amp; def_bar

此外,根本没有可以剥离的功能,因为你只是声明它们。实际上,由于def_foodef_bar是未定义的符号,因此链接此二进制文件会失败。

还有一件事:正确的是:

const struct func_ptrs DEFAULT_FUNCS = ...

没有星号,因为你初始化了一个结构,而不是一个指针。