gpt4 book ai didi

c++ - 如何使共享库符号强大?

转载 作者:太空宇宙 更新时间:2023-11-04 10:27:44 28 4
gpt4 key购买 nike

我创建了一个共享库,它引用了很多 C++ 模板函数。这些符号作为弱引用输入到共享库的导出表中(例如,当我使用 nm 查看共享库的符号时,它们显示为 W 类型)。这意味着在运行时,这些符号可能会被首先加载的不同共享库的拷贝插入。

对于我的应用程序来说,重要的是我的共享库使用这些函数的拷贝,这些函数包含在库本身中,而不是来自任何其他库。有什么办法可以确保这一点?在我看来,这相当于将所有各种模板实例静态链接到共享库中。

最佳答案

This means that at runtime, these symbols can possibly be interposed by copies from a different shared library that got loaded first.

请注意,无论弱属性如何,它们都可以被插入(请参阅 this GCC post,其中指出动态链接器将弱属性视为类似于强属性,除非设置了 LD_DYNAMIC_WEAK,但通常不会)。

It's important for my application that my shared library use the copies of these functions that are contained within the library itself, not from any other library. Is there any way to ensure this?

您可以做几件事。

通常推荐的方法是将 fvisibility=hidden 添加到您的 CFLAGS 以防止从您的库中导出任何符号,然后使用 __attribute__((visibility (“默认”)))。由于 rtld 需要处理更少的符号,这也将允许在编译时进行更好的优化和更快的启动。

穷人的有限解决方案是使用 -fvisibility-inlines-hidden,它是 -fvisility=hidden 的有限形式。它只会隐藏内联函数(例如来自 STL 模板的结果)。

如果您不想弄乱源代码,请使用 -Wl,-Bsymbolic 进行链接 - 这将强制在可能的情况下在库中解析引用。

-- 编辑--

实际上,即使您启用 -fvisibility=hidden 以防止其他库(或可执行文件本身)动态插入对导出的库内引用,您也需要 -Bsymbolic功能。

关于c++ - 如何使共享库符号强大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41027372/

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