Linux內核系列—11.操作系統開發之ELF格式

来源:http://www.cnblogs.com/joey-hua/archive/2016/04/16/5397340.html
-Advertisement-
Play Games

ELF文件的結構如下圖所示: ELF文件由4部分組成,分別是ELF頭(ELF header)、程式頭表(Program header table)、節(Sections)和節頭表(Section header table)。 實際上,一個文件中不一定包含全部這些內容,而且它們的位置也未必如上圖所示這 ...


ELF文件的結構如下圖所示:

ELF文件由4部分組成,分別是ELF頭(ELF header)、程式頭表(Program header table)、節(Sections)和節頭表(Section header table)。

實際上,一個文件中不一定包含全部這些內容,而且它們的位置也未必如上圖所示這樣安排,只有ELF頭的位置是固定的,其餘各部分的位置、大小等信息由ELF頭中的各項值來決定。

ELF header的格式如下代碼所示:

#define EI_NIDENT  16

typedef struct{
    unsigned char    e_ident[EI_NIDENT];
    Elf32_Half          e_type;
    Elf32_Half          e_machine;
    Elf32_word        e_version;
    Elf32_Addr         e_entry;
    Elf32_Off           e_phoff;
    Elf32_Off           e_shoff;
    Elf32_Word        e_flags;
    Elf32_Haif          e_ehsize;
    Elf32_Haif          e_phentsize;
    Elf32_Haif          e_phnum;
    Elf32_Haif          e_shentsize;
    Elf32_Haif          e_shnum;
    Elf32_Haif          e_shstrndx;
}Elf32_Ehdr;

其中各類型的說明見下表,由於ELF文件力求支持從8位到32位不同架構的處理器,所以才定義了下表中這些數據類型,從而讓文件格式與機器無關。

下麵看一下ELF header中各項的意義。foobar文件:

最開頭是16位元組的e_ident,其中包含用以表示ELF文件的字元,以及其他一些與機器無關的信息。

開頭的4位元組是固定不變的,第1個位元組值為0x7F,緊跟著就是ELF三個字元,這4位元組表明這個文件是個ELF文件。

1.e_type——標識的是該文件的類型,取值就不一一列出了。文件foobar的e_type是2,表明它是一個可執行文件。

2.e_machine——foobar中此項的值為3,表明運行該程式需要的體繫結構為Intel 80386.

3.e_version——文件的版本。

4.e_entry——程式的入口地址。文件foobar的入口地址為0x80480A0.

5.e_phoff——Program header table在文件中的偏移量(以位元組計數),這裡的值是0x34.

6.e_shoff——Section header table在文件中的偏移量(以位元組計數),這裡的值是0x1C0.

7.e_flags——對IA32而言,此項為0.

8.e_ehsize——ELF header大小(以位元組計數),這裡值為0x34.

9.e_phentsize——Program header table中每一個條目(一個Program header)的大小。這裡值為0x20.

10.e_phnum——Program header table中有多少個條目,這裡有3個。

11.e_shentsize——Section header table中每一個條目(一個Section header)的大小,這裡值為0x28.

12.e_shnum——Section header table中有多少個條目,這裡有6個。

13.e_shstrndx——包含節名稱的字元串表是第幾個節(從零開始數)。這裡值為5,表示第5個節包含節名稱。

我們看到,Program header table在文件中的偏移量(e_phoff)為0x34,而ELF header大小(e_ehsize)也是0x34,可見ELF header後面緊接著就是Program header table。Program header數據結構如下:

typedef struct{
    Elf32_Word        p_type;
    Elf32_Off            p_offset;
    Elf32_Addr         p_vaddr;
    Elf32_Addr         p_paddr;
    Elf32_Word        p_filesz;
    Elf32_Word        p_memsz;
    Elf32_Word        p_flags;
    Elf32_Word        p_align;
}Elf32_Phdr;

實際上Program header描述的是系統準備程式運行所需的一個段或其他信息。程式頭表中共有三項(e_phnum=3),偏移分別是0x34~0x53、0x54~0x73和0x74~0x93.

1.p_type——當前Program header所描述的段的類型。

2.p_offset——段的第一個位元組在文件中的偏移。

3.p_vaddr——段的第一個位元組在記憶體中的虛擬地址。

4.p_paddr——在物理地址定位相關的系統中,此項是為物理地址保留。

5.p_filesz——段在文件中的長度。

6.p_memsz——段在記憶體中的長度。

7.p_flags——與段相關的標誌。

8.p_align——根據此項值來確定段在文件以及記憶體中如何對齊。

Program header描述的是一個段在文件中的位置、大小以及它被放進記憶體後所在的位置和大小。如果我們想把一個文件載入進記憶體的話,需要的正是這些信息。

在foobar中共有三個Program header,其取值如下表所示:

根據這些信息,我們很容易知道foobar在載入進記憶體之後的情形,如下圖:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們可以很容易地使用HTML5導航對象獲取當前位置。請按照以下步驟來獲得城市/國家的細節。 首先包括jQuery庫 <script type="text/javascript" src="jquery.js"></script> jQuery(function() { //call navigato ...
  • 3.1.4--嚴格模式 嚴格模式: "use strick" 3.1.5--語句 要養成寫分號的編程習慣,否則代碼行結尾處沒有分號很容易導致代碼壓縮錯誤 3.3-- variable 分為全局變數和局部變數1.局部變數當函數被調用時,就會創建變數併為變數賦值,在函數調用完之後又立即被銷毀2.全局變數 ...
  • 移動開發的屏幕適配是一個難題,特別是Android的手機種類太多,屏幕差異性很大。iOS在iPhone6之後也增加了很多種解析度,也需要更多的考慮屏幕適配問題。不同的系統都提供了不少屏幕適配的機制和方法,但是需要很多繁瑣細緻的設計和實現,DeviceOne統一了屏幕適配的方式,開發者無需對這種細節了 ...
  • HTML5 canvas繪圖夜空小屋 伙伴們園友們,夜深了,休息啦,好人好夢... 查看效果:http://hovertree.com/texiao/html5/28/效果圖如下:代碼如下: 轉自:http://hovertree.com/h/bjaf/umtdyo4d.htm 更多特效:http: ...
  • 本文源地址 http://blog.163.com/txl129_2006@126/blog/static/1851087820103218453645/ 有改動。 什麼是HTML HTML的全拼是Hypertext Markup Language, 中文也就是超文本鏈接標示語言。HTML(Hype ...
  • 一、安裝android-studio https://github.com/inferjay/AndroidDevTools bundle版集成環境 win7 jdk(JAVA環境變數配置: “變數名”:Java_Home “變數值”:C:\Program Files\Java\jdk1.7.0_0 ...
  • 重載hash與isEqual:方法 前言 NSObject 自帶了hash與isEqual:方法,服務於具有hash表結構的數據結構。NSObject自帶的hash函數相當於hash表中的f(key)函數中的key,這“唯一”的key需要用戶自己產生,至於用什麼演算法由用戶自己決定。 準備 測試 1. ...
  • swift提供了3種主要的集合類型,array,set,dictionary。本節介紹array。 數組是存儲有序的相同類型的集合,相同的值可以多次出現在不同的位置。 註意: swift的Array類型橋接Foundation的NSArray類 數組類型簡單語法 swift數組類型完整寫作Array ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...