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 命令