- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我创建了一个共享库,它引用了很多 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/
Stackoverflow JS Genius的! 我当前的项目有一个问题,它正在使用 Node 的HTTP createServer,并使用Formidable来解析主体数据。 请参阅下面的代码。
我正在尝试将文件上传到我的 NodeJS 服务器。我目前收到错误: 错误:错误的内容类型 header ,未知的内容类型:image/jpeg “image/jpeg”是有效的 MIME 类型,为什么
我有一个用作路由器的 Node.JS 服务器,可以向它发出 post 请求以上传文件,应该只允许 jpg/png/jpeg 扩展名我目前正在做的是: var form = new formidable
我正在使用https://github.com/felixge/node-formidable用于使用express上传文件。 虽然它工作得很好,但有一个问题:我有一个包含 9 个 type="fil
Haskell 的类型推理引擎比 Scala 的类型推理引擎强大得多。在 Haskell 中,我很少需要显式编写类型,而在 Scala 中,类型只能在表达式中推断,而不能在方法定义中推断。 例如,请参
我将 Superpowered 用于各种实时 FX,它们都非常简单。然而,音高变换是另一回事,我认为事实上是因为它基于时间拉伸(stretch)算法,当然必须处理随时间变化的输出,这比应用 EQ 或混
我正在使用mean stack 和formidable上传文件 表单具有 multipart/form-data 属性 exports.create = function(req, res) {
我正在尝试构建我的第一个 node.js 应用程序,但是,使用 node server.js 运行时,我收到以下错误消息: connect: multipart: use parser (multip
对于强大的 npm 包,当我使用 import * as formidable from "formidable" 时,我收到一条错误消息,指出 formidable({ multiples: tru
我注意到了 std::string str; str += 'b'; // works str.append('b'); // does not work str.append(1, 'b'); //
我有一个需要访问本地 FS 的 HTML/JS(YUI 框架)照片管理器。我应该将 HTML/JS 移动到 AIR,还是硬着头皮将其“移植”到 Flex AIR? 我知道营销说的是什么,但我想要真正的
我是一名优秀的程序员,十分优秀!