我正在尝试在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
答案 0 :(得分:7)
尝试使用-no-pie
进行编译,请查看这些帖子以获取解释:
Assembling with GCC causes weird relocation error with regards to .data
简而言之:
Debian以64位模式切换到PIC / PIE二进制文件& GCC在你的情况下 试图将你的对象链接为PIC,但它会遇到绝对的 地址在mov $ str,%rdi。
答案 1 :(得分:3)
全额功劳 https://stackoverflow.com/users/3062591/brian
弄清楚如何使其工作。如果您像我一样,对nasm还是很陌生,或者如果出于某种原因,您对nasm还是陌生的,并且对gcc几乎没有做任何事情,那么您将需要运行以下命令:
nasm -felf64 YOUR_FILE.asm && gcc -no-pie YOUR_FILE.o && ./a.out
我能够使用
来获取致电printf
无需将其更改为
printf wrt ..got
以前曾尝试过一些NASM入门示例,但并非全部。