我正在构建一个共享库,我使用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,但这会导致共享库格式无效或应用程序无法链接(取决于我使用的是哪个)。
答案 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。