推 mozzan:很有幫助,感謝你的回答 03/22 14:12
※ 引述《mozzan (mozzan)》之銘言:
: 標題: [問題] library 和 linker 問題
: 時間: Tue Mar 19 20:30:01 2013
:
: 大家好
:
: 我想請問關於linking library的一些問題
:
: 假定現在有支程式會用到A library的Function X
:
: 所以在link 的時候會把Function X 複製一份到
:
: 執行檔裡頭嗎???
:
: 他應該不是將整包library copy 過來吧??
:
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc)
: ◆ From: 114.35.64.181
: 推 LPH66:有點想推《程式設計師的自我修養》這本書 (思) 03/19 20:49
: → diabloevagto:那本書推到爛了 03/19 21:22
不用出動到這本, 自己做實驗就可以了。
我在 linux 的測試方法:
建立一個 static library, 使用 ar rcs libt.a l1.o l2.o
寫一個 main function 呼叫 l1.o 裡頭的一個 function - f1(),
最後 link 這個 libt.a 得到的 elf 執行檔,
會包含 l1.o 所有的東西。
l2.o 的東西不會被複製到 elf 執行檔。
該怎麼檢查呢?
很簡單, 使用 objdump m 就可以了, 可以看到 f1(), f2() 都包含在內。
0000000000400544 <f1>:
400544: 55 push %rbp
400545: 48 89 e5 mov %rsp,%rbp
400548: bf 5c 06 40 00 mov $0x40065c,%edi
40054d: e8 ce fe ff ff callq 400420 <puts@plt>
400552: c9 leaveq
400553: c3 retq
0000000000400554 <f2>:
400554: 55 push %rbp
400555: 48 89 e5 mov %rsp,%rbp
400558: bf 5f 06 40 00 mov $0x40065f,%edi
40055d: e8 be fe ff ff callq 400420 <puts@plt>
400562: c9 leaveq
400563: c3 retq
source code:
https://github.com/descent/progs/tree/master/static_lib
: 我想知道他是靜態或是動態連結
: 我應該要怎麼看,是不是他會產生dll檔
程式是動態還是靜態連結, 這只能問你, 你應該有整個編譯環境,
編譯方法決定要使用 動態還是靜態連結 來產生最後結果。
不是每個開發環境的動態連結都會以 .dll 命名,
就算是以 .dll 命名, 你自己能確定那就是 動態連結 嗎?
如果你不知道, 那表示你對於開發環境完全不熟悉,
如果對於開發程式沒有影響, 到也不用急著了解。
: 推 QQ29:我也想問只有lib怎區分他是static or dynamic..看大小嗎xd 03/20 10:21
: ※ 編輯: mozzan 來自: 114.35.64.181 (03/20 12:34)
: → EdisonX: 我以為是看副檔名 …(誤) 03/20 12:14
: → hilorrk:readelf -h ? 03/20 23:33
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.125.239.46
※ 編輯: descent 來自: 59.125.239.46 (03/22 09:24)
※ 編輯: descent 來自: 59.125.239.46 (03/22 09:28)