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/elfinterp.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'ldso/ldso/microblaze/elfinterp.c') diff --git a/ldso/ldso/microblaze/elfinterp.c b/ldso/ldso/microblaze/elfinterp.c index 1f6aeffb7..33aef2f3e 100644 --- a/ldso/ldso/microblaze/elfinterp.c +++ b/ldso/ldso/microblaze/elfinterp.c @@ -214,16 +214,13 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope, case R_MICROBLAZE_NONE: case R_MICROBLAZE_64_NONE: break; - case R_MICROBLAZE_64: *reloc_addr = symbol_addr + rpnt->r_addend; break; - case R_MICROBLAZE_32: case R_MICROBLAZE_32_LO: *reloc_addr = symbol_addr + rpnt->r_addend; break; - case R_MICROBLAZE_32_PCREL: case R_MICROBLAZE_32_PCREL_LO: case R_MICROBLAZE_64_PCREL: @@ -231,16 +228,25 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope, case R_MICROBLAZE_SRW32: *reloc_addr = symbol_addr + rpnt->r_addend; break; - case R_MICROBLAZE_GLOB_DAT: case R_MICROBLAZE_JUMP_SLOT: *reloc_addr = symbol_addr + rpnt->r_addend; break; -/* Handled by elf_machine_relative */ case R_MICROBLAZE_REL: *reloc_addr = (unsigned long)tpnt->loadaddr + rpnt->r_addend; break; - +#if defined USE_TLS && USE_TLS + case R_MICROBLAZE_TLSDTPMOD32: + *reloc_addr = tls_tpnt->l_tls_modid; + break; + case R_MICROBLAZE_TLSDTPREL32: + *reloc_addr = symbol_addr; + break; + case R_MICROBLAZE_TLSTPREL32: + CHECK_STATIC_TLS ((struct link_map *) tls_tpnt); + *reloc_addr = tls_tpnt->l_tls_offset + symbol_addr + rpnt->r_addend; + break; +#endif case R_MICROBLAZE_COPY: if (symbol_addr) { #if defined (__SUPPORT_LD_DEBUG__) @@ -250,7 +256,6 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope, symname, sym_ref.sym->st_size, symbol_addr, reloc_addr); #endif - _dl_memcpy((char *)reloc_addr, (char *)symbol_addr, sym_ref.sym->st_size); @@ -260,7 +265,6 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope, _dl_dprintf(_dl_debug_file, "no symbol_addr to copy !?\n"); #endif break; - default: return -1; /* Calls _dl_exit(1). */ } @@ -279,14 +283,12 @@ _dl_do_lazy_reloc(struct elf_resolve *tpnt, struct r_scope_elem *scope, ELF_RELOC *rpnt, ElfW(Sym) *symtab, char *strtab) { int reloc_type; - int symtab_index; ElfW(Addr) *reloc_addr; #if defined (__SUPPORT_LD_DEBUG__) ElfW(Addr) old_val; #endif (void)scope; - symtab_index = ELF_R_SYM(rpnt->r_info); (void)strtab; reloc_addr = (ElfW(Addr)*)(tpnt->loadaddr + rpnt->r_offset); -- cgit v1.2.3