c 動態庫多層動態載入的問題

2021-10-07 04:02:09 字數 1187 閱讀 5603

問題描述:

今有第三方庫曰xplico,將xplico.c中的main函式改寫成xplico_main然後修改makefile,將之由可執行程式改造成動態庫libxplico.so

然後編寫測試程式test.cpp(與libxplico.so放到同一路徑下),其內容如下:

#include

#include

extern

"c"int

main

(int argc,

char

*ar**)

g++編譯之:# g++ test.cpp -o test -l. -lxplico -lpthread -wl,-rpath=.

執行test:#./test -m -pcap -f /home/cyz/wahaha.pcap

上述操作能夠正常執行

於是在主程式a.out主程式中直接通過thread呼叫xplico_main. 此時發現能夠正常啟動,於是問題變得不可理喻,為何主程式直接呼叫xplico_main可以,而通過中間庫liblib.so卻無能為力?

那麼是不是liblib.so中鏈結的libxplico中的符號對主程式a.out是不可見的呢?遂做如下嘗試

將主程式編譯時鏈結上libxplico.so, 程式執行依然遇到同樣的問題,然後ldd a.out發現a.out未能鏈結上libxplicos.so. 原因是雖然我在a.out鏈結階段指定了鏈結libxplico.so,但是未真正使用libxplico.so庫中的函式,導致鏈結器智慧型的跳過了鏈結libxplico.so

於是在xplico.c中新增乙個除錯函式

void

xplico_print()

a.out原始檔中新增

extern

"c"

重新編譯a.out, ldd檢視之則libxplico.so被正常鏈結,然後執行a.out發現問題解決!

那麼問題來了,為什麼會出現這種可執行程式直接載入沒有問題,而dlopen的庫中載入會導致這種符號未定義的錯誤呢?

檢視原始碼看到上述錯誤提示中dis_pcapf.so和liblib.so一樣,也是通過dlopen動態載入的,那麼,是不是dlopen載入的庫中間再次dlopen載入另乙個庫會導致二次載入庫中的符號對主程式不可見呢?等有時間求證吧

C 動態載入動態庫 AIX

部分內容 函式說明 1.開啟動態鏈結庫 include void dlopen const char filename,int flag 該函式返回操作控制代碼,如 void phandle dlopen strsofilepath,rtld lazy flag rtld lazy 暫緩決定,等有需...

動態載入動態庫

message函式的宣告你應該知道吧,把它的宣告和下面的語句寫到乙個標頭檔案中 pragma comment lib,a.lib 然後你的對話方塊.cpp中包含這個標頭檔案就可以使用message函式了。如果dll沒有對應的.lib檔案,那麼就只能使用動態載入的方式了。動態呼叫動態庫步驟 1 建立乙...

dlopen動態載入動態庫

為了使程式方便擴充套件,具備通用性,可以採用外掛程式形式。採用非同步事件驅動模型,保證主程式邏輯不變,將各個業務已動態鏈結庫的形式載入進來,這就是所謂的外掛程式。linux提供了載入和處理動態鏈結庫的系統呼叫,非常方便。本文先從使用上進行總結,涉及到基本的操作方法,關於動態鏈結庫的本質及如何載入進來...