2016-01-27 86 views
1

我正在使用gas並試圖對齊16字節的.lcomm緩衝區。Gas .align指令無法正常工作

代碼:

.align 16 

.lcomm Buffer, size 

但檢查緩衝區的使用萊亞爾指令的地址的時候。它似乎沒有對齊。我認爲.align指令無法正常工作。

請問您有什麼想法嗎?

回答

4

當然,它工作正常,但你用它錯了。 manual says

某些目標允許第三個參數與.lcomm一起使用。此 參數指定bss中的符號所需的對齊方式 部分。

所以正確的代碼是.lcomm Buffer, size, 16。 請注意,.align不會影響.lcomm,特別是如果您不在.bss部分。如果要手動分配物料,請切換到.bss,然後使用.align,然後使用.space而不是.lcomm進行分配。

此外,manual gives a workaround suggestion爲:

爲目標,其中.lcomm指令(見lcomm命令)不接受 對準的說法,這是大多數ELF目標的情況下,。本地 指令可以與.comm結合使用(參見Comm),以定義對齊的本地公用數據 。

事實上,在x86 ELF對齊參數不被支持,那麼實施這種方法看起來像:(感謝@wumpus-q-wumbley指出這一點)

.local Buffer 
.comm Buffer, size, 16 

+2

也有一個建議根據['.local'](https://sourceware.org/binutils/docs/as/Local.html)在不支持第三個參數的目標上使用'.local'和'.comm'。 –