summaryrefslogtreecommitdiff
path: root/ldso/ldso/microblaze/elfinterp.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldso/ldso/microblaze/elfinterp.c')
-rw-r--r--ldso/ldso/microblaze/elfinterp.c22
1 files changed, 12 insertions, 10 deletions
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);