42.Linux/Unix 系統程式設計手冊(下) -- 共享庫高階特性
阿新 • • 發佈:2018-12-14
1.動態載入庫 當一個可執行檔案開始執行之後,動態連結器會載入程式的動態依賴列表中的所有共享庫,但有時候需要延遲載入庫是比較有用的。 如只在需要的時候載入一個外掛。動態連結器的這項功能是通過一組 API 實現的。這組 API 被稱為 dlopen API。 dlopen API 使得程式能夠在執行的時候開啟一個共享庫,根據名字在庫中搜索一個函式,然後呼叫這個函式.在執行的時候才要這種 方式載入的共享庫通常被稱為動態載入的庫。 dlopen(); //開啟一個共享庫,返回一個供後續呼叫的控制代碼 dlsym(); //在庫中搜索一個符號(一個保護函式或者變數的字串)並返回其地址。 dlclose(); //關閉之前開啟的庫 dlerror(); //返回一個錯誤訊息字串 要在Linux上使用 dlopen API 構建程式的時候必須指定 -ldl 選項以便與 libdl 庫連結起來。 dladdr(); //返回一個包含地址 addr 的相關資訊. 2.在主程式中訪問符號 假設使用 dlopen() 動態載入了一個共享庫,然後使用 dlsym() 獲取了動態庫中 x() 函式的地址,然後呼叫 x()。 如果 x() 函式中呼叫了 y(),那麼通常會在程式載入的其中一個共享庫中搜索 y()。 有些時候需要讓 x() 呼叫主程式中的 y() 實現(類似於回撥機制)。為了達到這個目的就必須要使主程式的符號(全域性作用域) 對動態連結器可用,即在連結程式時使用 --export-dynamic 連結器選項。 gcc -W1,--export-dynamic main.c 或者 gcc --export-dynamic main.c 使用這些選項的一個就能夠允許動態載入的庫訪問主程式中的全域性符號。