我在彙編中寫入函數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
墊 彙編內的位置計數器,沒有任何對齊信息 最終將使它的二進制文件。因此,例如,如果這是該文件中的第一個 指令,則它是無操作的。我擔心,如果生成的對象 文件與其他目標文件鏈接,則可能會簡單地連接到 任意地址。
將對齊信息以某種方式使之成爲由彙編程序生成的目標文件 ?如果是這樣,這個機制是什麼,並且這個 記錄在某處?
類似地,確實最終二進制包含必要的對準信息 以確保OS文本部分映射到一個適當的基地址在 虛擬存儲器?
如果您喜歡,您可以在這裏假設Linux。
謝謝,這正是我想象的。我正在尋找另外兩件細節: 1.這是否記錄在某處?也許我只是讀了'.p2align'的鏈接彙編程序 文檔,但它並沒有說明有關 的任何信息,告知鏈接程序。 2.我假設一個類似的事情發生時,N個對象文件鏈接到一個 二進制 - 每個部分的最大對齊約束被選中? – jacobsa 2014-10-02 06:53:13