2014-10-02 45 views
1

我在彙編中寫入函數foo,並且由於各種原因,函數的第一個 指令必須在執行二進制文件時落在虛擬內存中的某個對齊地址處。例如,在下面的代碼 中,我請求了13位對齊,因此運行時 處的函數地址必須是0x2000的倍數。什麼確保在運行時遵守彙編程序對齊指令?

它很自然地做到這一點:

// The function must be aligned to 2^ALIGNMENT_BITS bytes. 
#define ALIGNMENT_BITS 13 

.text 
.p2align ALIGNMENT_BITS 
foo: 
    [...] 

然而,GNU assembler documentation只說.p2align墊 彙編內的位置計數器,沒有任何對齊信息 最終將使它的二進制文件。因此,例如,如果這是該文件中的第一個 指令,則它是無操作的。我擔心,如果生成的對象 文件與其他目標文件鏈接,則可能會簡單地連接到 任意地址。

  1. 將對齊信息以某種方式使之成爲由彙編程序生成的目標文件 ?如果是這樣,這個機制是什麼,並且這個 記錄在某處?

  2. 類似地,確實最終二進制包含必要的對準信息 以確保OS文本部分映射到一個適當的基地址在 虛擬存儲器?

如果您喜歡,您可以在這裏假設Linux。

回答

2

在ELF對象文件(例如Linux)中,節中存在的最大對齊值將傳播到該節的對齊位置。例如,編譯你上面提供的代碼,並在其上運行objdump -h表明部分有2**13對齊:

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .text   00200000 00000000 00000000 00100000 2**13 
        CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 

注意,同樣也是如此,如果.p2align在本節別處。否則,如果該部分移動的數量較少,則會違反該部分內的對齊!

+0

謝謝,這正是我想象的。我正在尋找另外兩件細節: 1.這是否記錄在某處?也許我只是讀了'.p2align'的鏈接彙編程序 文檔,但它並沒有說明有關 的任何信息,告知鏈接程序。 2.我假設一個類似的事情發生時,N個對象文件鏈接到一個 二進制 - 每個部分的最大對齊約束被選中? – jacobsa 2014-10-02 06:53:13