【问题标题】:Preventing symbols from being stripped in IBM Visual Age C/C++ for AIX防止符号在 IBM Visual Age C/C++ for AIX 中被剥离
【发布时间】:2011-02-15 03:03:25
【问题描述】:

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

【问题讨论】:

    标签: c++ aix


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      # 版本.exp: setVersion__Q2_3CIF17VersionReporterFRCQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__

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

      这里有更多信息:Developing and Porting C and C++ Applications on AIX

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 2016-06-06
        • 1970-01-01
        • 2018-06-06
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        相关资源
        最近更新 更多