“魔數”的來由

來源:互聯網
上載者:User

    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所示。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.