diff options
author | Khem Raj <kraj@mvista.com> | 2009-04-09 07:38:04 +0000 |
---|---|---|
committer | Khem Raj <kraj@mvista.com> | 2009-04-09 07:38:04 +0000 |
commit | 3c2a68b9dc9ae45f5eb0971a3e6583af732c3f91 (patch) | |
tree | 5e66ac6f4b89da6d854a304862d1b6337f8e4fd2 /ldso/ldso/m68k/dl-sysdep.h | |
parent | 0dca115912f5d64c96f14876fff3bd582a8c4a1b (diff) |
The attached patches fixes the problems found bringing up uclibc on coldfire
M5485 processor
1. Disable mmap2() if we're compiling for coldfire and fall back to mmap().
It seems to map a different file area on a 2.6.25 linux kernel.
2. Uses pc-relative addresing[1], computes ADDR_ALIGN, PAGE_ALIGN
and OFFSET_ALIGN relatively to _dl_pagesize[3].
On coldfire/M5485 _dl_pagesize is 0x2000.
Signed-off-by: Groleo Marius <groleo@gmail.com>
Diffstat (limited to 'ldso/ldso/m68k/dl-sysdep.h')
-rw-r--r-- | ldso/ldso/m68k/dl-sysdep.h | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/ldso/ldso/m68k/dl-sysdep.h b/ldso/ldso/m68k/dl-sysdep.h index 259cb84be..b5eda4e9c 100644 --- a/ldso/ldso/m68k/dl-sysdep.h +++ b/ldso/ldso/m68k/dl-sysdep.h @@ -42,19 +42,29 @@ extern unsigned long _dl_linux_resolver (struct elf_resolve *, int); static __always_inline Elf32_Addr elf_machine_dynamic (void) { - register Elf32_Addr *got __asm__ ("%a5"); - return *got; + Elf32_Addr got; + + __asm__ ("move.l _DYNAMIC@GOT.w(%%a5), %0" + : "=a" (got)); + return got; } +#ifdef __mcoldfire__ +#define PCREL_OP(OP, SRC, DST, TMP, PC) \ + "move.l #" SRC " - ., " TMP "\n\t" OP " (-8, " PC ", " TMP "), " DST +#else +#define PCREL_OP(OP, SRC, DST, TMP, PC) \ + OP " " SRC "(" PC "), " DST +#endif /* Return the run-time load address of the shared object. */ static __always_inline Elf32_Addr elf_machine_load_address (void) { Elf32_Addr addr; - __asm__ ("lea _dl_start(%%pc), %0\n\t" - "sub.l _dl_start@GOT.w(%%a5), %0" - : "=a" (addr)); + __asm__ (PCREL_OP ("lea", "_dl_start", "%0", "%0", "%%pc") "\n\t" + "sub.l _dl_start@GOT.w(%%a5), %0" + : "=a" (addr)); return addr; } |