我正在构建一个共享库,我使用 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 文档中所述的 -nogc,但这会导致共享库格式无效或应用程序无法链接(取决于我使用的是哪个应用程序)。
最佳答案
是的。这并没有真正连接到特定的语言或编译器。例如,相同的通用技术用于 gcc。 -bI:foo.exp 用于告诉链接器 foo.exp 中列出的符号将来自顶部的名称。同样,-BE:dog.exp 用于告诉链接器,dog.exp 中列出的符号已导出,可供其他人使用。
您可以看到/bin/ldd 和/bin/dump 可以用来查看这些符号。
关于c++ - 防止符号在 IBM Visual Age C/C++ for AIX 中被剥离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2759725/