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