2013年6月9日 星期日

static library 的連結方式

看到這篇的提問: http://www.ptt.cc/bbs/C_and_CPP/M.1363696204.A.E09.html
我自己也想知道, 不用出動到《程式設計師的自我修養》, 自己做實驗就可以了。

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 執行檔。

m.c
1 #include "l1.h"
2 
3 int main(int argc, const char *argv[])
4 {
5   f1();  
6   return 0;
7 }

該怎麼檢查呢?

很簡單, 使用 objdump 就可以了, 可以看到 f1(), f2() 都包含在內。

objdump -d m
 1 0000000000400544 <f1>:
 2   400544:       55                      push   %rbp
 3   400545:       48 89 e5                mov    %rsp,%rbp
 4   400548:       bf 5c 06 40 00          mov    $0x40065c,%edi
 5   40054d:       e8 ce fe ff ff          callq  400420 <puts@plt>
 6   400552:       c9                      leaveq 
 7   400553:       c3                      retq   
 8 
 9 0000000000400554 <f2>:
10   400554:       55                      push   %rbp
11   400555:       48 89 e5                mov    %rsp,%rbp
12   400558:       bf 5f 06 40 00          mov    $0x40065f,%edi
13   40055d:       e8 be fe ff ff          callq  400420 <puts@plt>
14   400562:       c9                      leaveq 
15   400563:       c3                      retq   

和書上教的是一樣的行為。

懶得列出所有程式碼, source code:
https://github.com/descent/progs/tree/master/static_lib

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。