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

时间:2016-03-15 09:59:33

标签: assembly dynamic compilation makefile relocation

我尝试用汇编语言创建函数并将它们放在动态库中,因此我使用此命令创建带有.S的.o:
    gcc -fPIC -shared hello.o -o libasm.so
但是当我想用gcc创建lib时:
    /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
它显示我这个错误:
   {{1}}

1 个答案:

答案 0 :(得分:5)

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

  

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

所以而不是

; ...
call     printf

使用

; ...
call     printf WRT ..plt

并正常编译和链接。