对齐在 .comm 指令中意味着什么?
What does alignment means in .comm directives?
我创建了两个文件 -
file.s
.data
.global hello
hello: .int 23
file1.s
.bss
.comm hello,32,4
.text
.global _start
_start:
mov $hello,%rbx
movl (%rbx),%eax
mov ,%rax
xor %rdi,%rdi
syscall
现在链接时,ld:警告:file.o 中符号“hello”的对齐 1 小于 file1.o 中的 4
我没有得到对齐部分。从 Doc ,
When using ELF or (as a GNU extension) PE, the .comm directive takes an optional third argument. This is the desired alignment of the symbol, specified for ELF as a byte boundary (for example, an alignment of 16 means that the least significant 4 bits of the address should be zero)
现在,为什么最低有效的 4 位应该为零?我假设是因为 12 位是符号的大小,而现在要与 16 对齐的其余 4 位是 0?那为什么 ld 会有警告?
注意错误信息:“alignment 1 of symbol 'hello' in file.o is smaller than 4”。问题不在于 .comm
,而是第一个未指定对齐方式的文件中的 .int
。要修复它,您可以在 .int
.
之前放置一个 .balign 4
我创建了两个文件 - file.s
.data
.global hello
hello: .int 23
file1.s
.bss
.comm hello,32,4
.text
.global _start
_start:
mov $hello,%rbx
movl (%rbx),%eax
mov ,%rax
xor %rdi,%rdi
syscall
现在链接时,ld:警告:file.o 中符号“hello”的对齐 1 小于 file1.o 中的 4 我没有得到对齐部分。从 Doc ,
When using ELF or (as a GNU extension) PE, the .comm directive takes an optional third argument. This is the desired alignment of the symbol, specified for ELF as a byte boundary (for example, an alignment of 16 means that the least significant 4 bits of the address should be zero)
现在,为什么最低有效的 4 位应该为零?我假设是因为 12 位是符号的大小,而现在要与 16 对齐的其余 4 位是 0?那为什么 ld 会有警告?
注意错误信息:“alignment 1 of symbol 'hello' in file.o is smaller than 4”。问题不在于 .comm
,而是第一个未指定对齐方式的文件中的 .int
。要修复它,您可以在 .int
.
.balign 4