天天看點

“魔數”的來由

    ELF魔數 我們可以從前面readelf的輸出看到,最前面的“Magic”的16個位元組剛好對應“Elf32_Ehdr”的e_ident這個成員。這16個位元組被ELF标準規定用來辨別ELF檔案的平台屬性,比如這個ELF字長(32位/64位)、位元組序、ELF檔案版本,如圖3-5所示。 

“魔數”的來由

    最開始的4個位元組是所有ELF檔案都必須相同的辨別碼,分别為0x7F、0x45、0x4c、0x46,第一個位元組對應ASCII字元裡面的DEL控制符,後面3個位元組剛好是ELF這3個字母的ASCII碼。這4個位元組又被稱為ELF檔案的魔數,幾乎所有的可執行檔案格式的最開始的幾個位元組都是魔數。比如a.out格式最開始兩個位元組為 0x01、0x07;PE/COFF檔案最開始兩個個位元組為0x4d、0x5a,即ASCII字元MZ。這種魔數用來确認檔案的類型,作業系統在加載可執行檔案的時候會确認魔數是否正确,如果不正确會拒絕加載。

  接下來的一個位元組是用來辨別ELF的檔案類的,0x01表示是32位的,0x02表示是64位的;第6個字是位元組序,規定該ELF檔案是大端的還是小端的(見附錄:位元組序)。第7個位元組規定ELF檔案的主版本号,一般是1,因為ELF标準自1.2版以後就再也沒有更新了。後面的9個位元組ELF标準沒有定義,一般填0,有些平台會使用這9個位元組作為擴充标志。

  各種魔數的由來

  a.out格式的魔數為0x01、0x07,為什麼會規定這個魔數呢?

  UNIX早年是在PDP小型機上誕生的,當時的系統在加載一個可執行檔案後直接從檔案的第一個位元組開始執行,人們一般在檔案的最開始放置一條跳轉(jump)指令,這條指令負責跳過接下來的7個機器字的檔案頭到可執行檔案的真正入口。而0x01 0x07這兩個位元組剛好是當時PDP-11的機器的跳轉7個機器字的指令。為了跟以前的系統保持相容性,這條跳轉指令被當作魔數一直被保留到了幾十年後的今天。

  計算機系統中有很多怪異的設計背後有着很有趣的曆史和傳統,了解它們的由來可以讓我們了解到很多很有意思的事情。這讓我想起了經濟學裡面所謂的“路徑依賴”,其中一個很有意思的叫“馬屁股決定航天飛機”的故事在網上流傳很廣泛,有興趣的話你可以在google以“馬屁股”和“航天飛機”作為關鍵字搜尋一下。

  ELF檔案标準曆史

  20世紀90年代,一些廠商聯合成立了一個委員會,起草并釋出了一個ELF檔案格式标準供公開使用,并且希望所有人能夠遵循這項标準并且從中獲益。1993年,委員會釋出了ELF檔案标準。當時參與該委員會的有來自于編譯器的廠商,如Watcom和Borland;來自CPU的廠商如IBM和Intel;來自作業系統的廠商如IBM和Microsoft。1995年,委員會釋出了ELF 1.2标準,自此委員會完成了自己的使命,不久就解散了。是以ELF檔案格式标準的最新版本為1.2。

  檔案類型 e_type成員表示ELF檔案類型,即前面提到過的3種ELF檔案類型,每個檔案類型對應一個常量。系統通過這個常量來判斷ELF的真正檔案類型,而不是通過檔案的擴充名。相關常量以“ET_”開頭,如表3-5所示。

“魔數”的來由

繼續閱讀