2012-08-30 79 views
4

字節碼二進制可執行文件(如Java類文件,Parrot字節碼文件或CLR文件)和機器碼可執行文件(如ELF,Mach-O和PE)之間有什麼區別。像Java字節碼和文件和機器碼可執行文件(如ELF)的字節碼有什麼區別?

這兩者之間有什麼特別的區別?

如ELF結構中的.text區域等於什麼部分的類文件?

或它們都有頭,但ELF和PE頭包含架構,但類文件不

Java類文件 Java Class file

ELF文件 ELF File

PE文件 PE File

+3

有沒有「規則」,如何使兩種類型的格式,這意味着有相當多的格式有巨大的變化。換句話說,這個問題不能真正回答100%。 –

+0

投票結束太寬泛。這歸結爲:瞭解提到的所有格式和執行環境~~ –

+0

可能的重複:http://stackoverflow.com/questions/1782415/what-is-the-difference-between-assembly-code-and-bytecode –

回答

11

在編譯成機器代碼之前,字節代碼是一箇中間步驟。由於最後一步需要加載時間(並且通常是運行時,就像實時(JIT)編譯的情況那樣),所以字節代碼與體系結構無關:運行時(.NET的CLR或Java的JVM)負責通過比較,本地代碼(Windows:PE,PE32 +,OS X/iOS:Mach-O,Linux/Android /等:ELF)是編譯代碼,適合於對於特定的體系結構(Android/iOS:ARM,其他大部分:Intel 32位(i386)或64位)。 (Old DOS支持「.com」格式,這是一個原始的內存映像)。在上述所有內容中,大致可以這樣說:

  • 第一個「」由編譯器創建的,並且是‘默認’或預計將有默認的行爲
    • 可執行主代碼部分,通常被稱爲‘文本’或「的.text」。這是本機代碼,可以在特定體系結構上運行
    • 字符串存儲在單獨的部分中。這些用於硬編碼輸出(打印出的內容)以及符號名稱。
    • 符號 - 鏈接器用於將可執行文件與其庫(Windows:DLL,Linux/Android:共享對象,OS X/iOS:.dylibs或框架)結合使用的內容存儲在單獨的部分中。通常還有一個「PLT」(過程鏈接表),它使編譯器能夠簡單地將存根(stub)放入您調用的函數(printf,open等)中,鏈接器在可執行文件加載時可以連接。
    • 導入表(以Windows的說法..在ELF中,這是一個DYNAMIC節,在OS X中這是一個LC_LOAD_LIBRARY命令)用於聲明其他庫。如果在加載可執行文件時未找到這些文件,則加載失敗,並且無法運行。
    • 導出表(用於庫/ dylibs/etc)是庫(或在Windows中,甚至是.exe)可以導出以便其他鏈接的符號。
    • 常量通常在您看到的「.rodata」中。

希望這會有所幫助。真的,你的問題是模糊..

TG

6

字節代碼是「中途」的一步。所以Java編譯器(javac)會將源代碼轉換爲字節碼。機器代碼是下一步,計算機將字節代碼轉換爲機器代碼(可由計算機讀取),然後通過讀取機器代碼執行程序。計算機無法直接讀取源代碼,編譯器也無法立即將其轉換爲機器代碼。您需要邁出一大步才能使程序正常工作。

+0

這並不是他所問的。 –

+0

這個信息是有幫助的,但並沒有告訴我結構的差異和相似之處 但這個信息讓我覺得字節碼只是函數調用.text和變量的定義.data – zeitue

+0

實際上有計算機體系結構可以執行Java字節碼本身。 – Antimony