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

时间:2016-03-21 10:25:09

标签: c++ linker visibility dynamic-library

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

使用-rdynamic编译主机应用程序显然可以解决此问题,但它不必要地将对象公开给主机应用程序的完整符号表,即使它只需要解决其中的一些问题。

如何准确指定共享对象将知道哪些主机应用符号?

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

1 个答案:

答案 0 :(得分:1)

您的问题未明确:您从未说过要构建的平台,使用的链接器等等。

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

  1. 如果您使用黄金(GNU ELF链接器),--export-dynamic-symboldo您需要的内容。
  2. 如果您使用的是binutils链接器,则可以使用链接器版本脚本执行相同操作(example)。
  3. 您可以使用__attribute__((visibility("default")))标记要导出的符号,使用-fvisibility-hidden进行编译,并使用-rdynamic进行关联。这应该隐藏大部分符号,但是如果链接到无法重新编译的库中,它将无法正常工作。