<< 45/64 >>
First Last

グローバル変数の話

call すると EIP が stack につまれることを利用して EIP を取ってきている

 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

なんで EIP が必要かというと、PIC はどこにでもロードできなければならないので、データ取ってくる時に絶対参照じゃなくて相対参照しないといけないから