From 9c343fd4030dcd7a52616f365893177dded50346 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Tue, 12 Jan 2010 17:51:32 -0800 Subject: mips/nptl: Pass correct parameters to dl_find_hash when resolving TLS relocations. Make use of macros from sys/asm.h in crt1.S These two changes are needed for mips nptl to boot once again. Signed-off-by: Khem Raj --- ldso/ldso/mips/elfinterp.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'ldso/ldso/mips') diff --git a/ldso/ldso/mips/elfinterp.c b/ldso/ldso/mips/elfinterp.c index b49f09d36..40c3e0939 100644 --- a/ldso/ldso/mips/elfinterp.c +++ b/ldso/ldso/mips/elfinterp.c @@ -148,7 +148,7 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt, unsigned long rel_addr, unsigned long rel_size) { ElfW(Sym) *symtab; - ElfW(Rel) *rpnt; + ELF_RELOC *rpnt; char *strtab; unsigned long i; unsigned long *got; @@ -162,7 +162,7 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt, /* Now parse the relocation information */ rel_size = rel_size / sizeof(ElfW(Rel)); - rpnt = (ElfW(Rel) *) rel_addr; + rpnt = (ELF_RELOC *) rel_addr; symtab = (ElfW(Sym) *) tpnt->dynamic_info[DT_SYMTAB]; strtab = (char *) tpnt->dynamic_info[DT_STRTAB]; @@ -172,8 +172,8 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt, char *symname = NULL; reloc_addr = (unsigned long *) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); - reloc_type = ELF_R_TYPE(rpnt->r_info); - symtab_index = ELF_R_SYM(rpnt->r_info); + reloc_type = ELF32_R_TYPE(rpnt->r_info); + symtab_index = ELF32_R_SYM(rpnt->r_info); symbol_addr = 0; debug_sym(symtab,strtab,symtab_index); @@ -206,12 +206,20 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt, # endif { ElfW(Sym) *sym_tls = &symtab[symtab_index]; - struct elf_resolve *tpnt_tls = tpnt; + struct elf_resolve *tpnt_tls = NULL; if (ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_LOCAL) { _dl_find_hash((strtab + symtab[symtab_index].st_name), - _dl_symbol_tables, tpnt_tls, 1, &sym_tls); + _dl_symbol_tables, tpnt, + elf_machine_type_class(reloc_type), &tpnt_tls); } +#if USE_TLS + /* In case of a TLS reloc, tpnt_tls NULL means we have an 'anonymous' + symbol. This is the case for a static tls variable, so the lookup + module is just that one is referencing the tls variable. */ + if (!tpnt_tls) + tpnt_tls = tpnt; +#endif switch (reloc_type) { case R_MIPS_TLS_DTPMOD64: -- cgit v1.2.3