diff options
-rw-r--r-- | ldso/ldso/cris/dl-sysdep.h | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/ldso/ldso/cris/dl-sysdep.h b/ldso/ldso/cris/dl-sysdep.h index 11872b5fa..4c2c98a03 100644 --- a/ldso/ldso/cris/dl-sysdep.h +++ b/ldso/ldso/cris/dl-sysdep.h @@ -1,6 +1,8 @@ /* CRIS can never use Elf32_Rel relocations. */ #define ELF_USES_RELOCA + #include <elf.h> + /* Initialization sequence for the GOT. */ #define INIT_GOT(GOT_BASE,MODULE) \ { \ @@ -77,14 +79,14 @@ cris_mod(unsigned long m, unsigned long p) | (((type) == R_CRIS_COPY) * ELF_RTYPE_CLASS_COPY)) static inline Elf32_Addr -elf_machine_dynamic (void) +elf_machine_dynamic(void) { /* Don't just set this to an asm variable "r0" since that's not logical (like, the variable is uninitialized and the register is fixed) and may make GCC trip over itself doing register allocation. Yes, I'm paranoid. Why do you ask? */ Elf32_Addr *got; - + __asm__ ("move.d $r0,%0" : "=rm" (got)); return *got; } @@ -99,22 +101,25 @@ elf_machine_dynamic (void) GOT entry for. */ static inline Elf32_Addr -elf_machine_load_address (void) +elf_machine_load_address(void) { Elf32_Addr gotaddr_diff; + __asm__ ("sub.d [$r0+_dl_parse:GOT16],$r0,%0\n\t" - "add.d _dl_parse:GOTOFF,%0" : "=r" (gotaddr_diff)); + "add.d _dl_parse:GOTOFF,%0" : "=r" (gotaddr_diff)); return gotaddr_diff; } static inline void -elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr, - Elf32_Word relative_count) +elf_machine_relative(Elf32_Addr load_off, const Elf32_Addr rel_addr, + Elf32_Word relative_count) { - Elf32_Rela * rpnt = (void *) (rel_addr + load_off); + Elf32_Rela *rpnt = (void *)(rel_addr + load_off); + --rpnt; do { - Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset); + Elf32_Addr *const reloc_addr = + (void *)(load_off + (++rpnt)->r_offset); *reloc_addr = load_off + rpnt->r_addend; } while (--relative_count); |