2010-01-10 176 views
3

我目前正在學習C++,並且有一些(基本的)我並不真正瞭解的東西,以及在哪裏找不到任何有用的搜索引擎。二進制文件和操作系統

  • 那麼所有的操作系​​統對於它們的可執行文件(Windows/Linux/Mac)有不同的「二進制格式」 - 有什麼區別?我的意思是所有這些都是二進制的,但是有什麼(除了所有的OS API)真的不同嗎? (Windows)這是一個愚蠢的問題 - 但所有的應用程序真的只是二進制(我的意思是隻有0和1)?它們以哪種格式存儲? (如您沒有看到0和1中的所有文本編輯器,但主要非顯示字符)

最好的問候, 喇嘛

+0

你是希臘人嗎?如果是這樣,「歡呼聲」馬上回來! – 2010-01-10 17:13:41

回答

7

可執行文件格式爲Windows(PE),Linux操作系統(ELF),OS/X等(MACH-O),往往被設計來解決共同的問題,所以他們都有着共同的特點。但是,每個平臺都指定不同的標準,因此即使平臺使用相同類型的CPU,文件也不跨平臺兼容。

可執行文件格式不僅可以用於可執行文件,還庫,其中也包含代碼,但從來沒有直接對用戶運行的 - 只加載到內存來滿足需求,直接執行的二進制文件。

的可執行文件格式的共同特點:

  • 一個或多個可執行代碼,例如文本只讀數據和數字
  • 一個或多個塊的
  • 一個或多個塊的塊讀/寫數據
  • 有關將應用程序運行時將這些塊放在內存中的說明
  • 有關哪些庫(也是「可執行文件格式」)的說明需要加載以及它們如何連接(鏈接)直到此可執行文件。
  • 一個或多個表將代碼和數據位置映射到描述它們的字符串或ID,可用於鏈接和調試。

它比較這樣的格式也同樣吸引更基本的格式,比如古老的DOS .com文件,它只是描述了各類「東西」的下一個可用位置被加載64K,並有少數列出的功能以上。

二進制在這個意義上是用來比較他們'源'文件,它是用文本格式寫的。二進制格式簡單地說它們是以非文本方式編碼的,並且不涉及二進制的0和1的意義。

7

的Windows可執行文件/ Linux的內容有所不同:

  • 文件標題的格式,即文件的一部分,用於索引文件其餘部分的位置和內容;
  • 系統調用所需的指令(中斷,寄存器內容等)
  • 二進制代碼鏈接在一起的實際格式; Linux有幾種不同的版本,我也認爲它適用於Windows。

應用程序是數據和機器語言操作碼,擠在一個文件中。可執行文件中的大多數字節不包含文本,因此可以包含0到255之間的值,即所有可能的值。人們會說這是二元的。在一個字節中有8位,因此每個字節可以被認爲包含8個二進制數字,其中一些將是0和一些1.

+0

你是最高的!如果不提大壩的低音,我就不能提出這樣的話題! – alemjerus 2010-01-10 17:16:12

4

當你仔細考慮它時,計算機中的每個文件都是「二進制」,即它在磁盤(甚至是文本文件)上以1和0的順序存儲。當您在文本編輯器中打開文件時,它會根據各種編碼規則將這些字符分組爲字符。現在,如果文件實際上是一個文本文件,這會給你可讀的文本。然而,如果文件不是,文本編輯器會忠實地嘗試和解碼比特流,但很可能最終會產生大量不可顯示的字符,因爲這些比特實際上不是字符的編碼形式,而是CPU指令。

至於你的問題的另一部分,關於「二進制格式」:有多種格式如何佈置一個可執行文件的各個部分,如ELF或Windows DLL/EXE格式。這些都說明確切位置在文件中的可執行文件的各個部分是(即其中的元數據是,這裏的符號表,這裏的切入點是,這裏的靜態數據和資源等)

2

最Windows的常用文件格式是PE;對於Linux是ELF。它們都包含大部分相同的東西(數據段,代碼段等),僅僅因爲它們是分開設計而不同。

需要注意的是,即使Windows和Linux都使用相同的文件格式,它們仍然無法運行彼此的二進制文件,因爲系統API和可用的DLL/SO完全不同。