c++:运行时链接共享对象与主机应用程序,符号表问题

标签 c++ linker visibility dynamic-library

我有一个 hostapp.cpp 在运行时加载一个 object.so 共享对象,共享对象仅使用所需的 .h 文件编译主机应用程序,但在运行时它需要访问这些功能(存在于主机应用程序中)。

使用 -rdynamic 编译主机应用程序显然解决了这个问题,但它不必要地将对象暴露给主机应用程序的完整符号表,即使它只需要解决其中的几个。

我如何才能准确指定共享对象将识别哪些主机应用程序符号?

编辑:我正在使用 GNU 工具链在 GNU/Linux 上构建和运行。

最佳答案

您的问题未明确说明:您从未说明您正在构建的平台、您使用的链接器等。

假设您为 Linux 构建,您可以使用以下方法之一指定要从主可执行文件导出的符号:

  1. 如果您使用的是 gold(GNU ELF 链接器),--export-dynamic-symboldo你需要什么。
  2. 如果您使用的是 binutils 链接器,则可以使用链接器版本脚本来执行相同的操作 (example)。
  3. 您可以使用__attribute__((visibility("default"))) 标记要导出的符号,使用-fvisibility-hidden 进行编译,并使用 进行链接-rdynamic。这应该会隐藏大部分符号,但如果您链接到无法重新编译的库,则效果不佳。

关于c++:运行时链接共享对象与主机应用程序,符号表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36128464/

相关文章:

c++ - 从 COM TypeLib 自动生成的 C++ 类不会在方法中返回 SAFEARRAY

c++ - 在通用 C++ 代码中移动基于范围的循环?

c - PIC(位置无关代码)

c - 链接描述文件有什么问题

css - 隐藏的可见性在具有 CSS 内容 : url(); 的 Microsoft Edge 上不起作用

c++ - 设置默认的 union 成员

c++ - 我想知道当函数在其中创建对象时会发生什么

makefile - crti.o 文件丢失

javascript - 如何检测元素可见性(z-index、固定、不透明度等)(Intersection Observer V2 替代方案)

android - 如何一次隐藏多个 View ?