推 steve1012: 這樣不是違反odr? 03/25 23:46
推 christianSK: E.exe 是怎麼call libA.so libB.so去拿instance的? 03/26 10:13
→ christianSK: 猜測只link到了libA.so/libB.so其中一個. 03/26 10:14
→ dreamboat66: liba and b.so都各自開一個不同名字的function 裡面 03/26 11:49
→ dreamboat66: 都是return GetInst(); E.exe去 呼叫這兩個不同名 03/26 11:49
→ dreamboat66: 函數 但得到同一個物件 03/26 11:49
→ Lipraxde: 他們不是叫同一個 GetInst 嗎 03/26 14:06
→ sarafciel: 好奇問一下 為什麼寫了Singleton卻還要弄兩份XD 03/26 14:25
→ dreamboat66: 希望是同一份 ,但想想覺得可能會兩份,測試起來 竟 03/26 14:29
→ dreamboat66: 然真的是一份 ,無法理解為什麼,想知道中間的差異 03/26 14:29
→ dreamboat66: 難道載入exe的時候也會扯到odr? 03/26 14:29
→ ketrobo: target_link_libraries(E PRIVATE A B S S2) 這裡? 03/26 15:27
→ dreamboat66: @ketrobo: 這部分 實驗 加跟沒加 有沒有差別,結論是 03/26 16:49
→ dreamboat66: 沒差都一樣行為,但我忘記貼在這邊之前刪除,謝謝 03/26 16:49
→ Lipraxde: libA.so 和 libB.so 有各自的 GetInst,但是 dynamic l 03/26 17:55
→ Lipraxde: inker 只會連結到A或B裡面的其中一個。(應該是看誰先被 03/26 17:55
→ Lipraxde: 載入) 03/26 17:55
→ Lipraxde: 把 -Wl,-Bsymbolic 加到 CXXFLAGS 裡,應該就會拿到不 03/26 17:55
→ Lipraxde: 同個 instance 了 03/26 17:55
→ dreamboat66: 意思是 lib ab 各自有同名symbol, 但照順序載入 發現 03/26 18:46
→ dreamboat66: 撞名 所以就只載入最一開始的那份,所以libb.so 呼叫 03/26 18:46
→ dreamboat66: 到的getinst是a.so的那份? 03/26 18:46
推 yilanP: 我有寫過一個class,也是需要兩份,裡面各自需要不同的st 03/26 20:39
→ yilanP: atic member,我是用template處理的,給你參考 03/26 20:39
推 firose: 這個應該叫 global symbol interpose 03/27 08:01
→ cole945: 簡單想成, -la -lb, 在.a和.so的結果會大同小異 03/27 11:23
→ cole945: loader用DT_NEED的順序解,多層依BFD找. DT_NEED的順序是 03/27 11:24
→ cole945: linktime決定, 所以 A B 就決定是找 A 的版本. 大致這樣 03/27 11:25