【发布时间】:2012-10-17 00:25:42
【问题描述】:
我对 Mac 上的 x64-assembly 还很陌生,所以我对在 64 位中移植一些 32 位代码感到困惑。
该程序应该通过 C 标准库中的 printf 函数简单地打印出一条消息。
我从这段代码开始:
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
希望有人知道我做错了什么。
【问题讨论】:
标签: macos gcc assembly x86-64 nasm