x64 nasm: вставка адресов памяти в стек и вызов функции
Я довольно новичок в x64-сборке на Mac, так что я путаюсь с переносом 32-битного кода в 64-битную.
Программа должна просто распечатать сообщение черезprintf
функция из стандартной библиотеки C.
Я начал с этого кода:
section .data
msg db 'This is a test', 10, 0 ; something stupid here
section .text
global _main
extern _printf
_main:
push rbp
mov rbp, rsp
push msg
call _printf
mov rsp, rbp
pop rbp
ret
Компилируем его с помощью nasm следующим образом:
$ nasm -f macho64 main.s
Возвращена следующая ошибка:
main.s:12: error: Mach-O 64-bit format does not support 32-bit absolute addresses
Я попытался исправить эту проблему, изменив код следующим образом:
section .data
msg db 'This is a test', 10, 0 ; something stupid here
section .text
global _main
extern _printf
_main:
push rbp
mov rbp, rsp
mov rax, msg ; shouldn't rax now contain the address of msg?
push rax ; push the address
call _printf
mov rsp, rbp
pop rbp
ret
Скомпилировано нормально сnasm
Команда выше, но теперь есть предупреждение при компиляции объектного файла сgcc
к актуальной программе:
$ gcc main.o
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not
allowed in code signed PIE, but used in _main from main.o. To fix this warning,
don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
Так как это предупреждение, а не ошибка, я выполнилa.out
файл:
$ ./a.out
Segmentation fault: 11
Надеюсь, кто-нибудь знает, что я делаю не так.