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 はどこにでもロードできなければならないので、データ取ってくる時に絶対参照じゃなくて相対参照しないといけないから