2010-04-03 79 views
4

我很好奇c/C++編譯器如何分析lib文件?我的意思是說我創建了一個包含一些類的庫,我在我的主程序中使用了這個庫。編譯器如何知道該庫中有什麼類名。當然,這些信息以二進制格式存在,我想在我的程序中使用該功能,具體來說,我有一個二進制lib文件,並且我想知道該lib文件中存在的所有類和屬性/函數。編譯器如何使用lib文件?

可能嗎?如果編譯器可以做到這一點,爲什麼不能一些庫?

感謝任何線索

回答

6

編譯器不會做你的建議是什麼,但鏈接程序。

編譯器從與lib文件相關的頭文件中知道它需要的信息。

然後鏈接程序將您正在包含的聲明和lib文件及其他對象文件放在一起。

例如,通過反編譯它可能從.lib文件中獲取信息,但這可能有很多工作,可能不是您要做的。

+0

我們可以在我們的程序中使用該功能嗎?有沒有任何鏈接器知道類名和屬性的庫? – Xinus 2010-04-03 05:37:36

+0

@Xinux:可能但我不知道他們。 – 2010-04-03 05:58:29

0

爲了在代碼擊中鏈接器時放大Brian R. Bondy's answer,最有用的人類信息已被刪除。例如,您可以從目標文件(庫)中提取以下信息:

class SomeClass implements SomeInterface { 
    int get(class &otherClass c, float x); 
    bool reallyCoolMethod(int x); 
    ... 
} 

這確實比實用程度少。圖書館文檔應該解釋你爲什麼要使用它以及如何使用它;如果圖書館沒有如此記錄,你可能需要一個更好的圖書館。

+0

我不認爲C++有接口:\ – 2010-04-03 19:17:16

1

根據你的系統(我知道這對於Linux上的.a文件是真的,對windows不太確定)庫文件只是一個存檔文件(因此.a)包含一堆普通的目標文件。認爲焦油或拉鍊,你會很關閉。鏈接器或多或少只是從檔案中提取文件,在命令行中粘貼它們並將所有內容鏈接在一起(實際上並沒有這樣做,因爲它有一些特殊的規則,比如只是懶惰地收集東西,但對於主題來說足夠接近在眼前)。

如果你想知道里面有什麼,可以使用庫工具(Linux上的IIRC ar)並深入研究文檔。即使金錢說,該工具將能夠提取目標文件,並從那裏你可以使用標準工具來提取其內容。

1

通常,一個.a庫只是一個存檔,它本身包含一堆目標文件。這些命令是在Linux上完成的,它會因平臺而異。通常,您可以通過運行nm libxxx.a

/usr/lib> nm libc.a | head -10 
init-first.o: 
     U abort 
     U _dl_non_dynamic_init 
0000000000000000 T _dl_start 
     w _dl_starting_up 
     U __environ 
     U __fpu_control 
     U __init_misc 
0000000000000004 C __libc_argc 

nm幫助頁中大量的細節什麼的輸出手段檢查檔案的基本內容。

ar命令可以爲您提取單個文件,例如

~/tmp> ar x libc.a init-first.o 
~/tmp> file init-first.o 
init-first.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped 

正如你可以在上面看到,這裏的對象是ELF格式,所以對於你問什麼複雜一點,你真正需要的是什麼,可以檢查ELF二進制文件。Linux的通常附帶命令readelf這將在命令行中給予了很多的信息:

~/tmp> readelf -s init-first.o 
Symbol table '.symtab' contains 19 entries: 
Num: Value Size Type Bind Vis  Ndx Name 
0: 00000000  0 NOTYPE LOCAL DEFAULT UND 
1: 00000000  0 SECTION LOCAL DEFAULT 1 
2: 00000000  0 SECTION LOCAL DEFAULT 3 
3: 00000000  0 SECTION LOCAL DEFAULT 4 
4: 00000000  0 SECTION LOCAL DEFAULT 5 
5: 00000000  0 SECTION LOCAL DEFAULT 6 
6: 00000000 11 FUNC GLOBAL DEFAULT 1 _dl_start 
7: 00000000  0 NOTYPE GLOBAL DEFAULT UND abort 
8: 00000010 133 FUNC GLOBAL DEFAULT 1 __libc_init_first 
9: 00000000  0 NOTYPE WEAK DEFAULT UND _dl_starting_up 
... 

設有一個圖書館libelf這很有可能你想要做什麼和編程訪問這些信息。我從來沒有使用它,因爲我總是從可用的命令行工具中獲得所需的信息。

http://directory.fsf.org/wiki/Libelf

相關問題