簡體   English   中英

鏈接到AIX上的共享庫

[英]Linking against a shared library on AIX

我正在嘗試使用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)

請注意,盡管二進制文件中存在符號(已通過nm驗證),但這里缺少'libapr-1',這表明它是靜態鏈接的。

對於簡單的程序來說,這並不是什么大問題。 不幸的是,我所討論的代碼使用可動態加載的模塊。 主程序調用apr_initialize,它在庫中設置一個靜態變量'apr_pools_initialized'。 然后,可加載模塊嘗試使用apr_pool_create,后者首先檢查是否已執行初始化。 由於它們具有自己的靜態鏈接的apr,因此靜態變量'apr_pools_initialized'與主程序初始化的內存位置不同。 這使靜態鏈接的二進制文件不起作用。

使用預編譯的二進制rpm(apr和apr-devel)安裝apr庫。 相關的庫文件位於:

# 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是不同的,因此不起作用。 關於這個主題,我找到了這個答案和另一個提供一些見解的libtool問題

問題是: 如何將其動態鏈接到二進制文件?

實際上,引用的鏈接包含此問題的解決方案,即:

-Wl,-brtl

添加這些LDFLAGS解決了鏈接問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM