0

我正在构建一个共享库,我使用 IBM 的 VisualAge C/C++ 编译器将它动态加载(使用 dlopen)到我的 AIX 应用程序中。不幸的是,它似乎删除了必要的符号:

rtld:0712-002 致命错误:正在退出。
rtld:0712-001 符号 setVersion__Q2_3CIF17VersionReporterFRCQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__ 被引用
来自模块 ./object/AIX-6.1-ppc/plugins/plugin.so(),但运行时定义
未找到该符号。

共享库和加载共享库的应用程序都针对包含错误消息中提到的 VersionReporter 的静态库编译/链接。

要链接共享库,我使用以下选项:-bM:SRE -bnoentry -bexpall 要链接应用程序,我使用此选项:-brtl

我可以使用一个选项来防止此符号在应用程序中被剥离吗?我已经尝试使用 IBM 文档中所述的 -nogc ,但这会导致共享库的格式无效或应用程序无法链接(取决于我使用它的那个)。

4

2 回答 2

1

是的。这与特定的语言或编译器没有真正的联系。例如,相同的通用技术用于 gcc。-bI:foo.exp 用于告诉链接器 foo.exp 中列出的符号将来自顶部的名称。同样,-BE:dog.exp 用于告诉链接器 dog.exp 中列出的符号已导出并且可以被其他人使用。

您可以看到 /bin/ldd 和 /bin/dump 可用于查看这些符号。

于 2010-05-15T15:50:34.827 回答
0

我想通了。诀窍是使用导出列表,以便不会删除插件中使用但二进制文件中未使用的符号。

# 版本.exp:
setVersion__Q2_3CIF17VersionReporterFRCQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__

然后在链接应用程序时使用: -brtl -bexpfull -bE:version.exp

此处有更多信息:在 AIX 上开发和移植 C 和 C++ 应用程序

于 2010-05-04T18:40:09.430 回答