2016-03-08 40 views
3

有什么办法可以使全局变量既“隐藏”和“别名”?这似乎以下就足够了:使全局变量“隐藏”和“别名”

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”允许链接成功,但不是所需的效果,因为静态将变量可见性范围限制在编译单元中,而不是范围更广的链接对象。

GCC 4.8.5和GCC 5.3.1都显示相同的行为。

回答

0

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

如果我用clang编译,它也可以。

0

我有一个类似的问题。我甚至没有试图使用隐藏的,我仍然得到了“不能等同于常见符号”的错误。解决的办法是将int __voo初始化为某个值(甚至是0)。也许这是一个BSS vs Data的事情,或者只是一个错误。