【发布时间】:2014-11-06 02:48:38
【问题描述】:
以下汇编代码在 OSX 10.9.4 上运行 as 时出错,但在 Linux (Debian 7.6) 上成功运行。特别是 movq 指令似乎不喜欢 label 参数。
$ cat test.S
.globl _main
_main:
movq $_main, %rax
ret
这是错误:
$ as -o test.o test.S
test.S:3:32-bit absolute addressing is not supported for x86-64
test.S:3:cannot do signed 4 byte relocation
将第 3 行中的 $_main 更改为像 $10 这样的文字可以正常工作。
代码必须以一种非常小的方式进行修改才能在 Linux 上运行 - 只需从标签中删除下划线即可。
$ cat test.S
.globl main
main:
movq $main, %rax
ret
独立验证代码是否可以在 Linux 上运行非常容易:
$ as -o test.o test.S
$ gcc -o test.out test.o
$ ./test.out
请忽略该代码实际上并没有做任何事情,我故意将其尽可能地精简以显示错误。
我对使用 LEA(加载有效地址)进行了相当多的研究,但在进行更改之前,我想了解其中的区别 - 为什么它适用于 Linux 而不是 OSX?
【问题讨论】:
-
+1 个写得很好的问题,带有一个非常好的最小、完整、可验证的代码示例