对齐在 .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