c++:运行时链接共享对象与主机应用程序,符号 table 问题
c++: runtime-linking shared object with host app, symbol table issue
我有一个 hostapp.cpp
在 运行 时加载一个 object.so
共享对象,共享对象仅使用来自主机应用程序的所需 .h 文件编译,但是在 运行 时,它需要访问这些功能(存在于主机应用程序中)。
使用 -rdynamic
编译主机应用程序显然解决了这个问题,但它不必要地将对象暴露给主机应用程序的完整符号 table,即使它只需要解决其中的几个问题.
如何准确指定共享对象将识别哪些主机应用程序符号?
编辑: 我正在使用 GNU 工具链在 GNU/Linux 上构建和 运行ning。
您的问题未明确说明:您从未说明您正在构建的平台是什么,您使用的 link 是什么,等等。
假设您为 Linux 构建,您可以使用以下方法之一指定要从主可执行文件导出的符号:
- 如果您使用的是 gold(GNU ELF linker),
--export-dynamic-symbol
将 do 您所需要的。
- 如果您使用的是 binutils linker,您可以使用 linker 版本脚本来执行相同的操作 (example)。
- 您可以用
__attribute__((visibility("default")))
标记要导出的符号,用-fvisibility-hidden
编译,用-rdynamic
标记link。这应该会隐藏大部分符号,但如果您在无法重新编译的库中 link,则效果不佳。
我有一个 hostapp.cpp
在 运行 时加载一个 object.so
共享对象,共享对象仅使用来自主机应用程序的所需 .h 文件编译,但是在 运行 时,它需要访问这些功能(存在于主机应用程序中)。
使用 -rdynamic
编译主机应用程序显然解决了这个问题,但它不必要地将对象暴露给主机应用程序的完整符号 table,即使它只需要解决其中的几个问题.
如何准确指定共享对象将识别哪些主机应用程序符号?
编辑: 我正在使用 GNU 工具链在 GNU/Linux 上构建和 运行ning。
您的问题未明确说明:您从未说明您正在构建的平台是什么,您使用的 link 是什么,等等。
假设您为 Linux 构建,您可以使用以下方法之一指定要从主可执行文件导出的符号:
- 如果您使用的是 gold(GNU ELF linker),
--export-dynamic-symbol
将 do 您所需要的。 - 如果您使用的是 binutils linker,您可以使用 linker 版本脚本来执行相同的操作 (example)。
- 您可以用
__attribute__((visibility("default")))
标记要导出的符号,用-fvisibility-hidden
编译,用-rdynamic
标记link。这应该会隐藏大部分符号,但如果您在无法重新编译的库中 link,则效果不佳。