【发布时间】:2022-01-23 18:44:27
【问题描述】:
我创建了两个文件 - 文件.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 $60,%rax
xor %rdi,%rdi
syscall
现在链接时,ld:警告:file.o 中符号 `hello' 的对齐 1 小于 file1.o 中的 4 我没有得到对齐部分。来自Doc,
当使用 ELF 或(作为 GNU 扩展)PE 时,.comm 指令采用可选的第三个参数。这是符号的所需对齐方式,为 ELF 指定为字节边界(例如,对齐 16 意味着地址的最低有效 4 位应为零)
现在,为什么最低有效 4 位应该为零?我假设因为 12 位是符号的大小,而现在要与 16 对齐的其余 4 位是 0 ?那么为什么会有来自 ld 的警告呢?
【问题讨论】:
-
我理解数据对齐,但我很困惑的是这个分数“最低有效 4 位应该为零”。我的假设对 ELF 文件是否正确?而且我做了 4 字节对齐(如果我的假设正确,那么 file.s 上定义的 hello 可以在这 32 个字节上完美对齐)。如果我的假设是正确的,那么为什么会发出警告?