浏览代码

Describe what this routine is supposed to do so we can port it
to other achitectures.

Eric Andersen 23 年之前
父节点
当前提交
9828d00d1b
共有 1 个文件被更改,包括 17 次插入1 次删除
  1. 17 1
      ldso/ldso/i386/resolve.S

+ 17 - 1
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