ELF 四 節頭表

2021-06-20 04:06:26 字數 1179 閱讀 9991

以32位為例,節頭表通過陣列實現,每個陣列項包含乙個節的資訊。各個節構成了程式頭表中定義的各段的內容。

/* section header.  */

typedef struct

elf32_shdr;

elf標準定義了若干固定名稱的節。這些用於執行大多數目標檔案所需的標準任務。所有名稱都從點開始,以便與使用者或非標準節相區分。

除上面在elf檔案中介紹的節之外,這裡在介紹一下其他的節:

.dynamic和.dynstr儲存了動態資訊

.interp儲存了程式直譯器的名稱,形式為字串。

.shstrtab包含了乙個字串表,定義了節的名稱。

.init和.fini儲存了程式初始化和結束時的機器指令。這兩個節的內容通常是由編譯器及其輔助工具自動建立的,主要是為重新建立乙個合適的執行時環境。

.hash是乙個雜湊表,允許在不對全表元素進行線性搜尋的情況下,快速訪問所有的符號表項。

節(對於可執行檔案)的address欄位儲存了有效的值,因為相應的**必須對映到虛擬位址空間中某些定義好的位置。在linux下,對應用程式通常使用0x8000000以上的記憶體區。

從上面可以看見該節頭表包含29個節,偏移量相對於二進位制檔案是0x890.節資訊無須複製到虛擬位址空間中為可執行檔案建立的最終的程序映像。儘管如此,該資訊在二進位制檔案中總是存在的。

每個節都指定了乙個型別,定義了節資料的語義。例子中最重要的值就是progbits(程式必須解釋的資訊,例如二進位制**)、symtab(符號表)和rel(重定位資訊)。strtab用於儲存於elf格式有關的字串,但與程式沒有直接關聯。例如,節的符號名稱(如果.text或.comment)。

各節都指定了大小和在二進位制檔案內部的偏移量,address欄位可用於指定節載入到虛擬位址空間中的位置。標誌代表如何訪問或處理。我們對a標誌比較感興趣,因為它控制著裝載檔案時是否將節的資料複製到虛擬位址空間。

儘管節可以自由選擇(節點以點開始,是由作業系統自身使用的,如果應用程式想要定義自身的節,就不應該以點開頭,以避免與系統節名稱衝突),linux(和所有其他使用efl的類unix系統都)提供了若干標準節,其中一些是強制性的。總有乙個名為.textd節儲存二進位制**,即與該檔案相關的程式資訊。.rel.text儲存了text節的重定位資訊。

ObjC第四節 繼承

繼 承 1 繼承 1.1 nsobject,根類,oc建立的類都繼承自根類,位於類層次結構的頂層,沒有父類 1.2 父類的例項變數和方法都可以被隱式的繼承過來成為子類的一部分,子類就可以直接訪問這些例項變數和方法 1.3 alloc和init是繼承自nsobject的方法 1.4 繼承的概念呈單鏈繼...

第四節 條件語句

if語句 if v 100else if v 50elseif語句不需要括號 用法高階 const filename abc.txt if contents,error ioutil.readfile filename error nilelse注意 contents和error變數都是在if 塊中...

DRF筆記四 節流

例如 一分鐘訪問三次 訪問記錄 try user request.request.post.get username password request.request.post.get password obj models.userinfo.objects.filter username user...