C - 使全局变量"隐藏"和"别名"



有没有办法使全局变量既"隐藏"又"别名"? 似乎以下内容就足够了:

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 将变量可见性范围限制为编译单元,而不是链接对象的更广泛范围。

英特尔系统工作室 2019、GCC 4.8.5 和 GCC 5.3.1 都显示相同的行为。

我也有类似的问题。 我什至没有尝试使用隐藏,我仍然遇到"不能等同于通用符号"错误。 解决方法是将int __voo初始化为某个值(甚至 0)。 也许这是一个BSS与数据的事情,或者只是一个错误。

我也通过向编译器调用提供-fno-common来让它工作。这可能会使一些不太正确的 C 代码停止工作,因此请在使用它之前阅读-fno-common的作用。

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

最新更新