我正在尝试在nasm中创建一个简单的程序,该程序应该显示字母a
。 但是,它给了我一个Segfault并说:
./a.out: Symbol `printf' causes overflow in R_X86_64_PC32 relocation
Segmentation fault (core dumped)
基本上,我正在尝试将值0x61
(字母 a 的十六进制(移动到内存地址 1234 中,然后将其作为参数传递给 printf。这是我的确切代码:
extern printf
section .text
global main
main:
push rbp
mov rax,0
mov qword [1234], 0x61 ; move 0x61 into address 1234
mov rdi, qword [1234] ; mov address 1234 into rdi
call printf ; should print the letter a
pop rbp
mov rax,0
ret
我正在运行 Linux x86_64
尝试使用-no-pie
编译,请查看以下帖子以获取解释:使用 GCC 组装会导致有关 .data 的奇怪重定位错误
总之:
Debian 切换到 64 位模式的 PIC/PIE 二进制文件,在你的情况下切换到 GCC 试图将您的对象链接为 PIC,但它会遇到绝对 MOV $str %RDI 中的地址。
全额归功于https://stackoverflow.com/users/3062591/brian
弄清楚如何让它工作。 如果你像我一样,对 nasm 非常陌生,或者由于某种原因你是 nasm 的新手并且对 gcc 几乎没有做任何事情,那么你将需要运行以下命令:
nasm -felf64 YOUR_FILE.asm && gcc -no-pie YOUR_FILE.o && ./a.out
我能够使用
致电打印
无需将其更改为
printf wrt ..有
在以前的尝试中有一些NASM介绍性示例,但不是全部。