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

Make AIX load all shared symbols at run time?

我在 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() 标志不会有任何影响,因为我的问题似乎与发生运行时链接时导入的符号有关。在构建 foo 以强制它导入所有共享库符号时,我可以使用某种类型的 ld 选项吗?同样的构建在我的 Linux 环境中运行良好。

我找到了罪魁祸首。

我 运行 'dump -Tv' 在 lib1.so 上发现我期望导出的函数 没有 (虽然它 did 出现在 nm 中,很奇怪)。该库与 -bexpall 链接,因此所有符号都应该在那里。我深入研究了 ld 手册页,发现 expall 确实 而不是 导出以下划线 (_) 为前缀的符号。我尝试使用的函数以下划线开头。我找到了 'expfull' ld 选项,它导出带有下划线前缀的符号,用该选项重建 lib1.so,现在一切都很好。