编译错误:针对未定义的符号重新定位R_X86_64_PC32

kil*_*mat 6 assembly makefile compilation dynamic relocation

我尝试用汇编语言创建函数并将它们放在动态库中,因此我使用此命令创建带有.S的.o
nasm -f elf64 hello.S -o hello.o
但是当我想用gcc创建lib时:
gcc -fPIC -shared hello.o -o libasm.so
它会显示以下错误:
/usr/bin/ld: hello.o: relocation R_X86_64_PC32 against undefined symbol printf@@GLIBC_2.2.5 can not be used when making a shared object; recompile with -fPIC

cat*_*cat 5

来自http://www.nasm.us/xdoc/2.10rc8/html/nasmdoc9.html#section-9.2.5:

要调用外部例程,必须使用另一种特殊的PIC重定位类型WRT ..plt.这比基于GOT的更简单:你只需用PLT相对版本CALL printf WRT ..plt替换CALL printf之类的调用.

而不是

; ...
call     printf
Run Code Online (Sandbox Code Playgroud)

使用

; ...
call     printf WRT ..plt
Run Code Online (Sandbox Code Playgroud)

并正常编译和链接.

  • 或者更好的是,像“gcc -fno-plt”一样使用“call [rel printf wrt ..got]”。完整详细信息请参阅[无法从汇编 (yasm) 代码在 64 位 Linux 上调用 C 标准库函数](/sf/ask/3648842991/) (2认同)