Nasm - 符号`printf'导致R_X86_64_PC32重定位溢出

Unk*_*own 11 linux gcc x86-64 nasm segmentation-fault

我试图在nasm中创建一个应该显示该字母的简单程序a.然而,它给了我一个Segfault并说:

./a.out: Symbol `printf' causes overflow in R_X86_64_PC32 relocation
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

基本上,我试图将值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
Run Code Online (Sandbox Code Playgroud)

我正在运行Linux x86_64

小智 13

尝试编译-no-pie,查看这些帖子的解释: 与GCC组装会导致与.data有关的奇怪的重定位错误

简而言之:

Debian在64位模式下切换到PIC/PIE二进制文件,在你的情况下GCC试图将你的对象链接为PIC,但它会遇到mov $ str,%rdi中的绝对地址.


小智 5

完全归功于 /sf/users/214381401/

弄清楚如何让它发挥作用。如果你像我一样对 nasm 非常陌生,或者如果由于某种原因你是 nasm 的新手并且对 gcc 几乎没有做任何事情,那么你将需要运行以下命令:

nasm -felf64 YOUR_FILE.asm && gcc -no-pie YOUR_FILE.o && ./a.out
Run Code Online (Sandbox Code Playgroud)

我能够使用

调用 printf

无需将其更改为

printf wrt ..得到

在之前的一些 NASM 介绍性示例中进行了尝试,但不是全部。