Ответ 1
Вы правильно знаете, что команда movq
не может ссылаться на абсолютный адрес. Это отчасти связано с форматом OS X ABI Mach-O, который использует перемещаемую адресацию для символов.
Программа, которая скомпилирована как независимый от позиции исполняемый файл (PIE
), вообще не может ссылаться на абсолютный виртуальный адрес таким же образом, как и movq $_main, %rax
. Вместо этого вызываются Глобальные таблицы смещения, которые позволяют относить относительный код позиции (PC-rel
) и не зависят от положения код (PIC
) для извлечения глобальных символов в их текущем абсолютном адресе. Демонстрированный ниже, GOTPCREL(%rip)
создает интерпретацию lea rdi, _msg
:
Код PC-rel, ссылающийся на него Глобальная таблица смещения:
.globl _main
_main:
movq [email protected](%rip), %rax
sub $8, %rsp
mov $0, %rax
movq [email protected](%rip), %rdi
call _printf
add $8, %rsp
ret
.cstring
_msg:
.ascii "Hello, world\n"
Mac OS X Mach-O Assembler:
$ as -o test.o test.asm
Apple версия GCC:
$ gcc -o test.out test.o
Вывод:
$ ./test.out
Hello, world