Re: understanding elf_machine_load_address

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Guido Guenther <guido.guenther@gmx.net> writes:

> Hi,
> I'm trying to understand to following snippet from glibc's
> sysdeps/mips/dl-machine.h:

That one is really a bit tricky but it should be correct.

You should add the comment in front:
/* Return the run-time load address of the shared object.  */

> elf_machine_load_address (void)
> {
>   ElfW(Addr) addr;
>   asm ("	.set noreorder\n"
>        "	la %0, here\n"

load address this object has at build time (that's the address objdump
prints) and which is different than the current address (a shared
library can be loaded to any address and elf_machine_load_address is
called before relocation).

>        "	bltzal $0, here\n"
>        "	nop\n"
>        "here:	subu %0, $31, %0\n"

Subtract shared address of "here" from address of "here" at build time
- and you know at which address byte 0 of the shared library is
  loaded.

>        "	.set reorder\n"
>        :	"=r" (addr)
>        :	/* No inputs */
>        :	"$31");
>   return addr;
> }
>
> As of my understanding addr is zero since $31-%0 is always
> zero(%0 stored (before the subu) the address of 'here', as does $31
> after the bltzal). Please beat me with a cluebat.

Enough cluebat?

Andreas
-- 
 Andreas Jaeger
  SuSE Labs aj@suse.de
   private aj@arthur.inka.de
    http://www.suse.de/~aj

[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux