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

时间:2018-01-03 04:41:53

标签: linux gcc segmentation-fault nasm x86-64

我正在尝试在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

2 个答案:

答案 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入门示例,但并非全部。