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
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 ..."
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With