gpt4 book ai didi

GCC:可见性内部 "pretty useless in real world usage"以什么方式?

转载 作者:行者123 更新时间:2023-12-03 20:48:57 26 4
gpt4 key购买 nike

我目前正在使用 GCC 为 QNX (x86) 开发一个库,并且我想制作一些仅在库中使用并且对其他模块不可见的符号,特别是对于使用该库的代码。

这已经可行,但是,在研究如何实现它时,我在 GCC 的文档中发现了一个非常令人担忧的段落(参见 http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Code-Gen-Options.html#Code-Gen-Options,标志 -fvisibility 的解释):

Despite the nomenclature, default always means public; i.e., available to be linked against from outside the shared object. protected and internal are pretty useless in real-world usage so the only other commonly used option is hidden. The default if -fvisibility isn't specified is default, i.e., make every symbol public—this causes the same behavior as previous versions of GCC.



我对“内部”可见性在现实世界中的使用非常无用非常感兴趣。根据我从 GCC 文档的另一段( http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Function-Attributes.html#Function-Attributes,对可见性属性的解释)的理解,可见性“内部”比可见性“隐藏”更强大(对我更有用):

Internal visibility is like hidden visibility, but with additional processor specific semantics. Unless otherwise specified by the psABI, GCC defines internal visibility to mean that a function is never called from another module. Compare this with hidden functions which, while they cannot be referenced directly by other modules, can be referenced indirectly via function pointers. By indicating that a function cannot be called from outside the module, GCC may for instance omit the load of a PIC register since it is known that the calling function loaded the correct value.



有人可以深入解释一下吗?

最佳答案

如果你只是想隐藏你的内部符号,只需使用 -fvisibility=hidden .它完全符合您的要求。
internal flag 比 hidden 走得更远。旗帜。它告诉编译器 ABI 兼容性并不重要,因为模块之外的任何人都不会使用该函数。如果某些外部代码确实设法调用该函数,它可能会崩溃。

不幸的是,有很多方法可以意外暴露 internal外部世界的函数,包括函数指针和 C++ 虚方法。例如,许多库使用回调来发出事件信号。如果您的程序使用这些库之一,则绝不能使用 internal作为回调函数。如果你这样做了,编译器和链接器就不会注意到任何错误,而且你的程序会有微妙的、难以调试的崩溃错误。

即使您的程序现在不使用函数指针,它也可能在几年后开始使用它们,因为每个人(包括您)都忘记了这个限制。为了微小的性能提升而牺牲安全通常是个坏主意,所以 internal可见性不是推荐的项目范围默认值。
internal如果您尝试优化一些频繁使用的代码,则可见性会更有用。您可以使用 __attribute__ ((visibility ("internal"))) 标记这几个特定功能,它告诉编译器速度比兼容性更重要。您还应该为自己留下评论,因此请记住永远不要使用指向这些函数的指针。

关于GCC:可见性内部 "pretty useless in real world usage"以什么方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21377630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com