Search code examples
assemblyx86-64nasmdynamic-linkingrelocation

Compile error: relocation R_X86_64_PC32 against undefined symbol


I try to make functions in assembly language and put them in a dynamic library so I create .o with .S with this command:
nasm -f elf64 hello.S -o hello.o
but when I want to create the lib with gcc:
gcc -fPIC -shared hello.o -o libasm.so
and it displays me this error:
/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


Solution

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

    To call an external routine, you must use another special PIC relocation type, WRT ..plt. This is much easier than the GOT-based ones: you simply replace calls such as CALL printf with the PLT-relative version CALL printf WRT ..plt.

    so instead of

    ; ...
    call     printf
    

    use

    ; ...
    call     printf WRT ..plt
    

    and compile and link as normal.

    BTW, "WRT" means "With Respect To ...", i.e, "in the context of ..."