防止在IBM Visual Age C / C ++ for AIX中剥离符号

时间:2010-05-03 16:59:13

标签: c++ aix

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

rtld: 0712-002 fatal error: exiting.
rtld: 0712-001 Symbol setVersion__Q2_3CIF17VersionReporterFRCQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__ was referenced
from module ./object/AIX-6.1-ppc/plugins/plugin.so(), but a runtime definition
of the symbol was not found.

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

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

我可以使用一个选项来阻止在应用程序中删除此符号吗?我已尝试使用IBM docs中所述的-nogc,但这会导致共享库格式无效或应用程序无法链接(取决于我使用的是哪个)。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

# version.exp:
setVersion__Q2_3CIF17VersionReporterFRCQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__

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

此处有更多信息:Developing and Porting C and C++ Applications on AIX