从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中调用函数?
答案 0 :(得分:0)
我可以通过将call puts
更改为call puts wrt ..plt
来实现此目的。
我在阅读了nasm文档的第9.2.5节后想出了这一点:http://www.nasm.us/doc/nasmdoc9.html#section-9.2.5。