Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compile error: relocation R_X86_64_PC32 against undefined symbol [duplicate]

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

like image 257
killmat Avatar asked Mar 15 '16 09:03

killmat


1 Answers

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 ..."

like image 161
cat Avatar answered Nov 03 '22 03:11

cat