Следующий код сборки дает ошибку при запуске as
в OSX 10.9.4, но работает успешно в 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
Изменение $_main
в строке 3 на литерал, такой как $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?