x86 での PIC のイヤなところ
int some_data;
int do_something() {
return some_data * 42;
}
とかすると、 do_something は
do_something:
pushl %ebp
movl %esp, %ebp
'''call __i686.get_pc_thunk.cx'''
addl $_GLOBAL_OFFSET_TABLE_, %ecx
movl some_data@GOT(%ecx), %eax
movl (%eax), %eax
addl %eax, %eax
movl %eax, %edx
sall $5, %edx
addl %edx, %eax
popl %ebp
ret
__i686.get_pc_thunk.cx:
movl (%esp), %ecx
ret
謎の call 命令