relocation problem
Dzianis Barzakouski
barzakouski@googlemail.com
Thu Mar 12 01:21:00 GMT 2009
Hi lan,
I was allready surprised with
__asm__("mov %ax, i");
c: 66 89 04 25 00 00 00 mov %ax,0x0
but I thought that this is another issue. Thanks!
Cheers,
Dzianis
2009/3/12 Ian Lance Taylor <iant@google.com>:
> 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