This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: %eip
- From: Ian Lance Taylor <ian at airs dot com>
- To: JANAPA REDDI VIJAY <Vijay dot Janapareddi at Colorado dot EDU>
- Cc: gcc-help at gcc dot gnu dot org
- Date: 06 Feb 2005 22:29:06 -0500
- Subject: Re: %eip
- References: <Pine.LNX.4.60.0502061956270.13886@eces.colorado.edu>
JANAPA REDDI VIJAY <Vijay.Janapareddi@Colorado.EDU> writes:
> I realize that in the _fini function the call instruction is executed
> to an instruction immediately following it and the value is
> immediately poped into a register. I am guessing this is done to get
> the instruction pointer since there is no direct way to get the ip on
> x86?! I have seen this behavior even in libc.
>
> I am unsure why this is needed to be done the way it is done? I am not
> able to generalize how the call and pop combination is used by the
> compiler.
>
> Any comments on that are much appreciated. Thank you.
>
> 0x80489a0 <_fini>: push %ebp
> 0x80489a1 <_fini+1>: mov %esp,%ebp
> 0x80489a3 <_fini+3>: push %ebx
> 0x80489a4 <_fini+4>: push %edx
> ***> 0x80489a5 <_fini+5>: call 0x80489aa <_fini+10>
> ***> 0x80489aa <_fini+10>: pop %ebx
> 0x80489ab <_fini+11>: add $0x11ce,%ebx
You need to pay attention to the add, also. This sequence is used to
get the pointer to the global offset table in position independent
code. The use of the call/pop sequence gets the current PC. The
compiler, assembler and linker cooperate to ensure that the global
offset table is always at a fixed known offset from the text section.
Adding 0x11ce will turn out to be the correct offset from the pop
instruction to the global offset table. The global offset table, in
turn, is used to access all global variables and non-hidden functions.
This kind of code will appear in position independent code--that is,
code compiler with -fpic or -fPIC. It will not normally appear in
code compiled without -fpic or -fPIC. It is possible that the _fini
function is always compiled with -fPIC so that it will be suitable for
any executable or shared library.
Let us know if that does not answer your question.
Ian