relocation problem
Ian Lance Taylor
iant@google.com
Thu Mar 12 00:29:00 GMT 2009
Dzianis Barzakouski <barzakouski@googlemail.com> writes:
> I am trying to compile following code:
>
> ===lib.c====
> extern int foo();
>
> int bar()
> {
> int j = foo();
> return j;
> }
> ==========
>
> ===add.c===
> static int i = 0;
>
> int foo()
> {
> __asm__("mov 42, %ax");
> __asm__("mov %ax, i");
> return i;
> }
> ==========
>
> gcc -fPIC -c -o lib.o lib.c
> gcc -fPIC -c -o add.o add.c
> gcc -shared lib.o add.o -o lib.so
> /usr/bin/ld: add.o: relocation R_X86_64_32S against `a local symbol'
> can not be used when making a shared object; recompile with -fPIC
>
> I thought that is due static declaration but it removing don't solves
> the problem. Is this expected behavior? If yes, can somebody explain?
Compiling with -fPIC changes the assembler output to use different
instructions. You have written your asm statement using a non-PIC
instruction sequence. If you want this to work in a shared library, you
need to use a PIC instruction sequence.
You can find the PIC instruction sequence by compiling some code with
--save-temps and looking at the .s file. In this case it should be
something like
mov %ax, i(%rip)
Ian
More information about the Gcc-help
mailing list