gpt4 book ai didi

linux - 在 Linux 上使用 RIP 相对寻址的段错误

转载 作者:太空狗 更新时间:2023-10-29 12:06:42 28 4
gpt4 key购买 nike

我有一段简单的汇编代码,可以在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com