<< 44/64 >>
First Last

グローバル変数の話

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