让AIX在运行时加载所有共享符号?

时间:2015-01-06 23:04:57

标签: c reference module aix dlopen

我在AIX 5.3上使用C。

我有一个应用程序(foo)在运行时链接到共享库(lib1.so),然后通过dlopen()动态加载另一个库(lib2.so)。 lib2.so使用lib1.so中的一些函数,foo不使用。当我执行应用程序时,出现类似于:

的错误
rtld: 0712-001 Symbol someLibFunc was referenced from module
/libdir/lib2.so(), but a runtime definition of the symbol was not found.

我不相信更改dlopen()标志会产生任何影响,因为我的问题似乎与运行时链接发生时导入的符号有关。是否有一些类型的ld选项,我可以在构建foo时强制它导入所有共享库符号?同样的构建在我的Linux环境中运行良好。

1 个答案:

答案 0 :(得分:0)

我找到了罪魁祸首。

我在lib1.so上运行'dump -Tv',发现我希望导出的函数是而不是(虽然 以nm显示,说来也怪)。该库与-bexpall链接,因此所有符号都应该在那里。我深入挖掘了ld手册页,看到expall的 not 导出符号前缀为下划线(_)。我试图使用的功能以下划线开头。我找到了'expfull'ld选项,它导出前缀为下划线的符号,用该选项重建lib1.so,现在一切都很好。