From 191739597c6d380692885cfdd8dd8aa4f31f029d Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Mon, 31 Oct 2016 18:05:44 +0100 Subject: microblaze: add NPTL/TLS support from GNU libc Not perfect, but a starting point. Some tests of the test suite are failing. --- ldso/ldso/microblaze/dl-sysdep.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'ldso/ldso/microblaze/dl-sysdep.h') diff --git a/ldso/ldso/microblaze/dl-sysdep.h b/ldso/ldso/microblaze/dl-sysdep.h index b293d27cc..43200271e 100644 --- a/ldso/ldso/microblaze/dl-sysdep.h +++ b/ldso/ldso/microblaze/dl-sysdep.h @@ -1,5 +1,3 @@ -/* elf reloc code for the microblaze platform, based on glibc 2.3.6, dl-machine.h */ - /* The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -15,37 +13,41 @@ License along with the GNU C Library; if not, see . */ -/* Use reloca */ #define ELF_USES_RELOCA #include - /* Initialise the GOT */ -#define INIT_GOT(GOT_BASE,MODULE) \ -do { \ - GOT_BASE[2] = (unsigned long) _dl_linux_resolve; \ - GOT_BASE[1] = (unsigned long) MODULE; \ +#define INIT_GOT(GOT_BASE,MODULE) \ +do { \ + GOT_BASE[1] = (unsigned long) MODULE; \ + GOT_BASE[2] = (unsigned long) _dl_linux_resolve; \ } while(0) /* Here we define the magic numbers that this dynamic loader should accept */ - #define MAGIC1 EM_MICROBLAZE #undef MAGIC2 /* Used for error messages */ #define ELF_TARGET "microblaze" +/* Need bootstrap relocations */ +#define ARCH_NEEDS_BOOTSTRAP_RELOCS + struct elf_resolve; unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry); #define elf_machine_type_class(type) \ - (((type) == R_MICROBLAZE_JUMP_SLOT) * ELF_RTYPE_CLASS_PLT \ + (((type) == R_MICROBLAZE_JUMP_SLOT || \ + (type) == R_MICROBLAZE_TLSDTPREL32 || \ + (type) == R_MICROBLAZE_TLSDTPMOD32 || \ + (type) == R_MICROBLAZE_TLSTPREL32) \ + * ELF_RTYPE_CLASS_PLT \ | ((type) == R_MICROBLAZE_COPY) * ELF_RTYPE_CLASS_COPY) /* Return the link-time address of _DYNAMIC. Conveniently, this is the first element of the GOT. This must be inlined in a function which uses global data. */ -static inline Elf32_Addr +static __always_inline Elf32_Addr __attribute__ ((unused)) elf_machine_dynamic (void) { Elf32_Addr got_entry_0; @@ -56,7 +58,6 @@ elf_machine_dynamic (void) return got_entry_0; } - /* Return the run-time load address of the shared object. */ static inline Elf32_Addr elf_machine_load_address (void) @@ -64,6 +65,7 @@ elf_machine_load_address (void) /* Compute the difference between the runtime address of _DYNAMIC as seen by a GOTOFF reference, and the link-time address found in the special unrelocated first GOT entry. */ + Elf32_Addr dyn; __asm__ __volatile__ ( "addik %0,r20,_DYNAMIC@GOTOFF" @@ -72,8 +74,6 @@ elf_machine_load_address (void) return dyn - elf_machine_dynamic (); } - - static __always_inline void elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr, Elf32_Word relative_count) -- cgit v1.2.3