gpt4 book ai didi

linux - 在 64 位模式下编译 NASM 代码时出现重定位错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:17 24 4
gpt4 key购买 nike

我已经编写了一个简单的汇编代码,我试图在 64 位模式下编译它。这是代码:

extern printf

section .rodata
readinfo db `%d\n`, 0

section .text
global main
main:
mov rbp, rsp ; for correct debugging

mov rax, 5
push rax
push readinfo
call printf
add rsp, 8

xor rax, rax
mov rsp, rbp
ret

下面是我给 nasm 和 gcc 的说明(正如我在其他帖子中读到的,gcc 自动将目标文件与默认的 c 库链接):

nasm -f elf64 -o test.o test.asm -D UNIX
gcc -o test test.o

但是,我收到以下重定位错误:

/usr/bin/x86_64-linux-gnu-ld: test.o: relocation R_X86_64_32S against `.rodata' can not be used when making a PIE object; recompile with -fPIC

/usr/bin/x86_64-linux-gnu-ld: final link failed: Nonrepresentable section on output

collect2: error: ld returned 1 exit status

当我使用“-no-pic”选项编译以禁用与位置无关的代码时,它编译时没有错误,但在执行后我得到了一个没有输出的段错误。当我重新编译 32 位代码(用 32 位替换 64 位寄存器)时,我没有收到任何错误。命令是:

nasm -f elf32 -o test.o test.asm -D UNIX
gcc -o test test.o -m32

我的问题是:为什么我不能在 64 位模式下使用 PIC 编译代码?

附言:这不是 Can't link a shared library from an x86-64 object from assembly because of PIC 的副本,因为错误是不同的,并且在那篇文章中找到的解决方案与我的问题无关。我已编辑错误输出以指定。

最佳答案

错误是我使用了错误的调用约定。在架构 x86_64 中,前两个参数分别在 rdi 和 rsi 中传递,而不使用堆栈。另外,我需要在通话中添加“wrt ..plt”。以下代码有效:

extern printf

section .rodata
readinfo db `%d\n`, 0

section .text
global main
main:
mov rbp, rsp ; for correct debugging

mov rsi, 5
mov rdi, readinfo
xor rax, rax
call printf wrt ..plt

xor rax, rax
mov rsp, rbp
ret

nasm 和 gcc 的命令没有改变。

关于linux - 在 64 位模式下编译 NASM 代码时出现重定位错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51407270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com