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@xxxxxxxxxx>: > Dzianis Barzakouski <barzakouski@xxxxxxxxxxxxxx> 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 >