Mar*_*tin 4 macos 64-bit assembly x86-64 nasm
我试图printf在OS86的x86-64汇编代码中做一个基本的例子,这是我的第一个版本:
section .data
msg db 'hello', 0Ah
section .text
extern _printf
global _main
_main:
sub rsp, 8
mov rdi, msg
mov rax, 0
call _printf
add rsp, 8
ret
Run Code Online (Sandbox Code Playgroud)
因此,此代码运动的绝对地址msg变成rdi了第一个参数_printf,然后GCC抱怨缺乏位置无关的代码.二进制文件仍然有效:
? nasm -f macho64 new.asm && gcc -m64 -o new new.o && ./new
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in _main from new.o. To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
hello
Run Code Online (Sandbox Code Playgroud)
因此,当我使用[rel ...]nasm语法更改代码以使用RIP相对寻址时,警告消失但现在可执行文件会出现错误:
section .data
msg db 'hello', 0Ah
section .text
extern _printf
global _main
_main:
sub rsp, 8
mov rdi, [rel msg]
mov rax, 0
call _printf
add rsp, 8
ret
Run Code Online (Sandbox Code Playgroud)
当我编译并运行它时:
? nasm -f macho64 new.asm && gcc -m64 -o new new.o && ./new
zsh: segmentation fault ./new
Run Code Online (Sandbox Code Playgroud)
有谁知道出了什么问题?
的问题是,原始mov rdi, msg装载的存储器地址msg进rdi在装配的时间.
当它被更改为时mov rdi, [rel msg],这个生成的代码使用值msg作为相对地址,如调试时所见:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000a6f6c6c6568
Run Code Online (Sandbox Code Playgroud)
注意解决如何包含字节msg,0x00000a<olleh>.
正确的解决方案是使用该lea指令msg在运行时加载有效的RIP相对地址,如下所示:
lea rdi, [rel msg]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2266 次 |
| 最近记录: |