0
我有兩個動態庫,a.so和b.so.兩個庫都包含一個函數f(),每個庫中的代碼都不相同。該函數在另一個函數ga()和gb()的每個庫中調用。重複的符號動態加載
我也有一個可執行程序,使用dlopen()動態加載這兩個庫。這個程序在某個時候調用ga()和gb()。什麼函數f()將在每種情況下執行?
這是所有的C代碼,所以f()在a.so和b.so中應該是相同的符號。
我有兩個動態庫,a.so和b.so.兩個庫都包含一個函數f(),每個庫中的代碼都不相同。該函數在另一個函數ga()和gb()的每個庫中調用。重複的符號動態加載
我也有一個可執行程序,使用dlopen()動態加載這兩個庫。這個程序在某個時候調用ga()和gb()。什麼函數f()將在每種情況下執行?
這是所有的C代碼,所以f()在a.so和b.so中應該是相同的符號。
f()會在每種情況下執行什麼函數?
它取決於。
如果你是一個常用的類UNIX系統上,你沒有使用任何特殊標誌在編譯或鏈接a.so
和b.so
,並且f()
是一個全球性的(即不一個功能static
),然後是f
從任何一個共享庫dlopen
編輯第一個是將被調用的,假設RTLD_GLOBAL
標誌被用於dlopen
。
,當你在編譯時使用-fvisibility=hidden
這樣的回答改變,或-Bsymbolic
在鏈接時,或使用連接器腳本來限制f
知名度或鏈接器版本腳本來分配不同的符號版本的兩個實例,或RTLD_LOCAL
,或...(我相信我錯過了更多方式來改變行爲)。
沒有使用特殊標誌進行編譯。不過,我簡化了一下這個問題。實際上,這會變得混亂,因爲重複的是Ada代碼,這對我來說更加模糊。 – juanrgar