On 4/29/2010 8:34 AM, Joakim Tjernlund wrote: >> >> >>> On 04/27/2010 07:44 AM, Timo Teräs wrote: >>>> Joakim had a clean up patch for the above construct. See patch 1/2 of: >>>> http://lists.uclibc.org/pipermail/uclibc/2010-April/043840.html >>>> (patch 2/2 there is wrong). See also rest of the thread. >>>> >>>> For some reason that did not got merged yet. Austin, care to merge >>>> that? >>>> >>>> But otherwise looks good. >>> >>> I was waiting for the discussion between you and Joakim to finish up and >>> a complete patch to come out of it, then I just sort of forgot about it. >>> Can someone resend the patch against current master? Thanks! >>> >>> Regarding the question you asked in that thread: When I added TLS >>> support in the i386 ldso, it was mostly based off of glibc code. I only >>> did cursory testing with it, and honestly am unsure about why that >>> particular check is there. >>> >>> ldso needs to have some more common code for sure, it's confusing and >>> incredibly hard to maintain now. But the more pressing need is to get >>> protected symbol support in for everybody that needs it. >>> >> >> Tried to wrap my head around this and PROTECTED definitively needs >> to move to common code. The best I can com up with is below. >> All callers needs to be updated with too. This is what >> I can do ATM. Hopefully you guys can manage from there. >> >> Jocke >> >> diff --git a/ldso/ldso/dl-hash.c b/ldso/ldso/dl-hash.c >> index 0048734..ffaf953 100644 >> --- a/ldso/ldso/dl-hash.c >> +++ b/ldso/ldso/dl-hash.c >> @@ -269,7 +269,7 @@ _dl_lookup_sysv_hash(struct elf_resolve *tpnt, ElfW(Sym) >> *symtab, unsigned long >> * relocations or when we call an entry in the PLT table for the first time. >> */ >> char *_dl_lookup_hash(const char *name, struct dyn_elf *rpnt, struct >> elf_resolve *mytpnt, >> - int type_class, struct elf_resolve **tpntp) >> + int type_class, struct elf_resolve **tpntp, const ElfW(Sym) >> *ref_sym) >> { >> struct elf_resolve *tpnt = NULL; >> ElfW(Sym) *symtab; >> @@ -282,7 +282,11 @@ char *_dl_lookup_hash(const char *name, struct dyn_elf >> *rpnt, struct elf_resolve >> #ifdef __LDSO_GNU_HASH_SUPPORT__ >> unsigned long gnu_hash_number = _dl_gnu_hash((const unsigned char >> *)name); >> #endif >> - >> + if (ELF32_ST_VISIBILITY(ref_sym->st_other) == STV_PROTECTED) { >> + sym = ref_sym; >> + tpnt = mytpnt; >> + goto sym_found; >> + } >> for (; rpnt; rpnt = rpnt->next) { >> tpnt = rpnt->dyn; >> >> @@ -332,7 +336,7 @@ char *_dl_lookup_hash(const char *name, struct dyn_elf >> *rpnt, struct elf_resolve >> } >> #endif >> } /* end of for (; rpnt; rpnt = rpnt->next) { */ >> - >> +sym_found: >> if (sym) { >> /* At this point we have found the requested symbol, do binding */ >> #if defined(USE_TLS) && USE_TLS >> diff --git a/ldso/ldso/x86_64/elfinterp.c b/ldso/ldso/x86_64/elfinterp.c >> index 54528d3..f8a0cb0 100644 >> --- a/ldso/ldso/x86_64/elfinterp.c >> +++ b/ldso/ldso/x86_64/elfinterp.c >> @@ -56,21 +56,23 @@ _dl_linux_resolver(struct elf_resolve *tpnt, int >> reloc_entry) >> char **got_addr; >> ElfW(Addr) instr_addr; >> char *symname; >> + ElfW(Sym) *sym; >> >> rel_addr = (char *)tpnt->dynamic_info[DT_JMPREL]; >> this_reloc = (ELF_RELOC *)(rel_addr + reloc_entry); >> symtab_index = ELF_R_SYM(this_reloc->r_info); >> - >> symtab = (ElfW(Sym) *)tpnt->dynamic_info[DT_SYMTAB]; >> strtab = (char *)tpnt->dynamic_info[DT_STRTAB]; >> - symname = strtab + symtab[symtab_index].st_name; >> + sym = &symtab[symtab_index]; >> + symname = strtab + sym->st_name; >> >> /* Address of the jump instruction to fix up. */ >> instr_addr = (this_reloc->r_offset + tpnt->loadaddr); >> got_addr = (char **)instr_addr; >> >> /* Get the address of the GOT entry. */ >> - new_addr = _dl_find_hash(symname, tpnt->symbol_scope, tpnt, >> ELF_RTYPE_CLASS_PLT, NULL); >> + new_addr = _dl_find_hash(symname, tpnt->symbol_scope, tpnt, >> + ELF_RTYPE_CLASS_PLT, sym); >> if (unlikely(!new_addr)) { >> _dl_dprintf(2, "%s: Can't resolve symbol '%s'\n", _dl_progname, >> symname); >> _dl_exit(1); >> @@ -174,7 +176,8 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct dyn_elf >> *scope, >> >> if (symtab_index) { >> symbol_addr = (ElfW(Addr))_dl_find_hash(symname, scope, tpnt, >> - elf_machine_type_class(reloc_type), &tls_tpnt); >> + elf_machine_type_class(reloc_type), >> + &tls_tpnt, sym); >> /* >> * We want to allow undefined references to weak symbols - this >> * might have been intentional. We should not be linking local > > Guys, I hope you are not waiting for me to complete this. I am too lazy > to build a working env. and got too little time. > > Jocke >
Hi Jocke, I need more time to understand better protected symbols and latest changes... I hope to fix sh soon, but I need a deep understanding of the matter before. So I'm not waiting for you to fix sh too ;) cheers, carmelo > _______________________________________________ > uClibc mailing list > [email protected] > http://lists.busybox.net/mailman/listinfo/uclibc > _______________________________________________ uClibc mailing list [email protected] http://lists.busybox.net/mailman/listinfo/uclibc
