链接 AIX 上的共享库

Posted

技术标签:

【中文标题】链接 AIX 上的共享库【英文标题】:Linking against a shared library on AIX 【发布时间】:2013-04-02 12:49:45 【问题描述】:

我正在尝试使用 gcc/libtool 链接 AIX 5.3 上的共享库 (apr)。

编译器的输出如下(为简单起见,删除了一些不相关的标志):

libtool: link: gcc  -o test test.o  -L/opt/freeware/lib -lapr-1 -lpthread -Wl,-blibpath:/opt/freeware lib:/usr/lib:/lib 

然后我检查了生成的二进制文件使用了哪些共享库:

$ ldd test 
test needs:
     /usr/lib/libc.a(shr.o)
     /usr/lib/libpthread.a(shr_xpg5.o)
     /unix
     /usr/lib/libcrypt.a(shr.o)
     /usr/lib/libpthreads.a(shr_comm.o)

请注意这里缺少“libapr-1”,尽管二进制文件中有符号(用 nm 验证),这表明它是静态链接的。

对于简单的程序来说,这不是什么大问题。不幸的是,我的代码使用动态可加载模块。主程序调用 apr_initialize 在库中设置一个静态变量“apr_pools_initialized”。然后可加载模块尝试使用 apr_pool_create 首先检查是否已执行初始化。由于它们有自己的静态链接 apr,因此静态变量“apr_pools_initialized”与主程序初始化的内存位置不同。这使得静态链接的二进制文件不起作用。

apr 库是使用预编译的二进制 rpm(apr 和 apr-devel)安装的。相关的库文件在那里:

# rpm -ql apr|grep \\.so$
/opt/freeware/lib/libapr-1.so
/opt/freeware/lib64/libapr-1.so
/usr/lib/libapr-1.so

# rpm -ql apr-devel|grep \\.a$
/opt/freeware/lib/libapr-1.a
/opt/freeware/lib64/libapr-1.a
/usr/lib/libapr-1.a
/usr/lib64/libapr-1.a
/usr/lib64/libapr-1.so

我试图删除“.a”文件,希望链接器别无选择,只能使用“.so”并动态链接它,不幸的是 AIX 不同,这不起作用。 关于这个话题,我找到了this 答案和another libtool question,它们提供了一些见解。

问题是:如何将它动态链接到我的二进制文件?

【问题讨论】:

it.toolbox.com/groups 上的一个特殊组中有很多 AIX 人。需要简单的注册。 (我在那里没有经济利益)。祝你好运。 【参考方案1】:

实际上引用的链接包含了这个问题的解决方案,即:

-Wl,-brtl

添加这些 LDFLAGS 解决了链接问题。

【讨论】:

以上是关于链接 AIX 上的共享库的主要内容,如果未能解决你的问题,请参考以下文章

将静态库链接到共享库(例如openmp)是一个好主意

Qt系列文章之三十八(基于QWidget 创建和使用动态dll共享库)

Qt系列文章之三十八(基于QWidget 创建和使用动态dll共享库)

链接静态库 Vs。 Linux 中的共享库

如何运行时调试共享库?

构建链接到其他非标准共享库的共享库