2017-02-18 100 views
0

我有兩個動態庫,a.so和b.so.兩個庫都包含一個函數f(),每個庫中的代碼都不相同。該函數在另一個函數ga()和gb()的每個庫中調用。重複的符號動態加載

我也有一個可執行程序,使用dlopen()動態加載這兩個庫。這個程序在某個時候調用ga()和gb()。什麼函數f()將在每種情況下執行?

這是所有的C代碼,所以f()在a.so和b.so中應該是相同的符號。

回答

0

f()會在每種情況下執行什麼函數?

取決於

如果你是一個常用的類UNIX系統上,你沒有使用任何特殊標誌在編譯或鏈接a.sob.so,並且f()是一個全球性的(即不一個功能static),然後是f從任何一個共享庫dlopen編輯第一個是將被調用的,假設RTLD_GLOBAL標誌被用於dlopen

,當你在編譯時使用-fvisibility=hidden這樣的回答改變,或-Bsymbolic在鏈接時,或使用連接器腳本來限制f知名度或鏈接器版本腳本來分配不同的符號版本的兩個實例,或RTLD_LOCAL,或...(我相信我錯過了更多方式來改變行爲)。

+0

沒有使用特殊標誌進行編譯。不過,我簡化了一下這個問題。實際上,這會變得混亂,因爲重複的是Ada代碼,這對我來說更加模糊。 – juanrgar