Nasm - 符号"printf"导致R_X86_64_PC32重新定位时溢出



我正在尝试在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介绍性示例,但不是全部。

相关内容

  • 没有找到相关文章