使全局变量“隐藏”和“别名”

时间:2016-03-08 18:47:35

标签: c gcc attributes alias hidden

有没有办法让全局变量“隐藏”和“别名”?似乎以下就足够了:

int __voo __attribute__((visibility("hidden")));
extern int voo __attribute__((weak,alias("__voo")));

但结果是:

$ gcc -c alias.c
/tmp/cczCek0H.s: Assembler messages:
/tmp/cczCek0H.s:5: Error: `voo' can't be equated to common symbol '__voo'

删除“弱”无效。 但是,在变量声明中添加“static”允许链接成功,但不是所需的效果,因为static将变量可见性范围限制为编译单元,而不是链接对象的更广泛范围。

GCC 4.8.5和GCC 5.3.1都表现出相同的行为。

2 个答案:

答案 0 :(得分:0)

我还通过向编译器调用提供-fno-common来实现它。这可能会使一些不严格正确的C代码停止工作,所以在使用之前请阅读-fno-common的内容。

如果我用clang编译它也有效。

答案 1 :(得分:0)

我有类似的问题。我甚至没有尝试使用隐藏的东西,而且我仍然无法将#34;等同于共同的符号"错误。修复是将int __voo初始化为某个值(甚至为0)。也许这是一个BSS vs Data的事情,或者只是一个bug。