无法将nasm程序集与libc函数链接(需要动态R_X86_64_PC32 reloc)

时间:2017-08-14 07:47:33

标签: gcc nasm ld

从nasm教程here我得到了一个汇编程序的代码:

    global main
    extern puts

    section .text
main:
    mov rdi, message
    call    puts
    mov rax, 0
    ret
message:
    db  "Hola, mundo", 0

我用nasm -felf64 hola.asm

组装它

但是,我还没有能够链接生成的hola.o文件。

我已经尝试过(根据教程)运行gcc hola.o,但会导致以下错误:

  

/ usr / local / bin / ld:error:hola.o:需要动态R_X86_64_PC32重定位' puts'这可能会在运行时溢出;用-fPIC重新编译

     

collect2:错误:ld返回1退出状态

传递-fPIC没有帮助,-Wl,-I/lib/ld-2.25.so也没有。

我尝试直接与ld链接失败,我认为因为我错过了实际定义_start符号的任何内容,导致我在生成可执行文件时出现seg错误。

我还尝试按nasm issue relocation R_X86_64_PC32 shared library的建议添加default rel,但这也不起作用。

我还尝试在C中编写main方法,然后调用一个在汇编中调用puts的函数。这也给了我动态的reloc错误。

如何链接nasm程序集文件以便它可以在x86_64 linux上的libc中调用函数?

1 个答案:

答案 0 :(得分:0)

我可以通过将call puts更改为call puts wrt ..plt来实现此目的。

我在阅读了nasm文档的第9.2.5节后想出了这一点:http://www.nasm.us/doc/nasmdoc9.html#section-9.2.5