C_and_CPP 板


LINE

最近遇到一個問題 無法理解行為為什麼會是這樣. 我在某static lib 稱作libS.a 裡面實作了一個簡單的singleton (介面為GetInst) 我有兩個dynamic lib, (libA.so, libB.so) 都使用這S.a , 而E.exe是link 這兩個.so 而沒有直接使用.a 附上Cmake file 可以比較明確知道關係 set(CMAKE_CXX_VISIBILITY_PRESET hidden) add_library(S STATIC s.cpp) add_library(S2 STATIC s2.cpp) <==這邊故意改成S2 讓他變成兩個.a add_library(A SHARED a.cpp) target_link_libraries(A PRIVATE S) add_library(B SHARED b.cpp) target_link_libraries(B PRIVATE S2) <==故意, 原本寫S也是一樣結果 add_executable(E main.cpp) target_link_libraries(E PRIVATE A B S S2) 我的問題是 因為是.a 我用nm看A.so跟B.so裡面都有 "GetInst"這symbol 我預期他們各自有獨立的singleton, 意思是從GetInst拿到的instance要不一樣 我用E.exe去驗證這件事, 沒想到 拿到的竟然是一樣的instance, 我故意夾個log 並且把s.cpp 複製一份叫做s2.cpp 然後產出libS2.a 如上CMake所述 我能發現的是 E.exe執行的時候 最後呼叫到static library的時候 他只會走其中一個 實作 這邊給我的感覺可能扯到ODR, 但我整件事兜不起來覺得很困惑 如果今天libS.a不是static而是libS.so, 整件事應該相當合理 可是它是static lib 最後卻只有一份 是有什麼設定我沒有做 還是這非常正常....如果是可否給我一些觀念上的補充 因為以我這簡單的lib間的關係 難道"兩個.so 用到不同的.a 而這不同的.a有相同symbol 最後產出的exe 只會選擇走一 個實作" 這件事很難碰到嗎? 謝謝 --



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







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP