From 9828d00d1b755bc280ed26789503cbc60296ea21 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Thu, 3 May 2001 06:35:12 +0000 Subject: Describe what this routine is supposed to do so we can port it to other achitectures. --- ldso/ldso/i386/resolve.S | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/ldso/ldso/i386/resolve.S b/ldso/ldso/i386/resolve.S index 4abf243f4..97948ef91 100644 --- a/ldso/ldso/i386/resolve.S +++ b/ldso/ldso/i386/resolve.S @@ -1,5 +1,21 @@ /* - * These are various helper routines that are needed to run an ELF image. + * This function is _not_ called directly. It is jumped to (so no return + * address is on the stack) when attempting to use a symbol that has not yet + * been resolved. The first time a jump symbol (such as a function call inside + * a shared library) is used (before it gets resolved) it will jump here to + * _dl_linux_resolve. When we get called the stack looks like this: + * reloc_entry + * tpnt + + * This function saves all the registers, puts a copy of reloc_entry and tpnt + * on the stack (as function arguments) then make the function call + * _dl_linux_resolver(tpnt, reloc_entry). _dl_linux_resolver() figures out + * where the jump symbol is _really_ supposed to have jumped to and returns + * that to us. Once we have that, we overwrite tpnt with this fixed up + * address. We then clean up after ourselves, put all the registers back how we + * found them, then we jump to where the fixed up address, which is where the + * jump symbol that got us here really wanted to jump to in the first place. + * -Erik Andersen */ .text -- cgit v1.2.3