作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一段简单的汇编代码,可以在 Mac OS X (x86-64) 上正常工作,但在 Linux (x86-64) 上不能正常工作:
.data
.align 4
foo: .quad 1,2
.text
.globl fun
fun:
movapd foo(%rip), %xmm1
ret
从一个简单的 C 程序调用:
int main(void){
fun();
return 0;
}
在 Mac 上发生的情况是 xmm1 寄存器被 foo 位置的数据填充,即在 GDB 中:
(gdb) p $xmm1
$2 = {
...
v2_int64 = {2, 1},
uint128 = 0x00000000000000020000000000000001
}
当我在 Linux 下运行相同的代码时出现段错误 - 似乎 foo 标签对应于 0x0:
> objdump -d asm.o
...
Disassembly of section .text:
0000000000000000 <fun>:
0: 66 0f 28 0d 00 00 00 movapd 0x0(%rip),%xmm1
...
有人可以解释为什么会发生这种情况以及我可以做些什么来避免这种情况吗?
干杯
最佳答案
在主线 gnu binutils 上,在 i386 和 x86_64 上,.align n
指令告诉汇编程序对齐到 n 个字节(但是,在某些体系结构和平台上,它有其他含义。请参阅完整详细信息的文档)。
在 OS X 上,.align n
指令告诉汇编程序对齐到 2^n 字节。这就是您的代码在 Mac 上运行的原因。
如果您想要一致的跨平台行为,请改用 .p2align
指令,它在两个平台上都受支持,并告诉汇编程序对齐到 2^n 字节。
关于linux - 在 Linux 上使用 RIP 相对寻址的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9177418/
我是一名优秀的程序员,十分优秀!