nptl: mark symbols with libc forwarder hidden

Joakim Tjernlund joakim.tjernlund at transmode.se
Fri Apr 16 12:56:32 UTC 2010


Timo Teräs <timo.teras at gmail.com> wrote on 2010/04/16 13:04:57:
>
> Timo Teräs wrote:
> > Joakim Tjernlund wrote:
> >> Timo Teräs <timo.teras at gmail.com> wrote on 2010/04/16 11:39:00:
> >>> Joakim Tjernlund wrote:
> >>>>>> Yes. Exactly that. It's __attribute__(( visibility("protected") )).
> >>>>>> Or .protected for asm. I'm doing a patch on this right now.
> >>>>>> http://www.ohse.de/uwe/articles/gcc-attributes.html#func-visibility
> >>>>> But this is PROTECTED and you might need to impl. STB_PROTECTED in
> >>>>> ldso
> >>>> That should be STV_PROTECTED
> >>>>
> >>>>> to support it. I once looked at that when I was hacking ldso in uClibc
> >>>>> some years ago but I don't remember the details any more.
> >>> Ah, you're right. It does need ld.so support. I'll try to figure out
> >>> if it's easy to implement, or if we get away with some linker flags.
> >>>
> >>
> >> This MIGHT do it(completely untested):
> >>
> >> diff --git a/ldso/ldso/i386/elfinterp.c b/ldso/ldso/i386/elfinterp.c
> >> index a01c1d0..7f1b408 100644
> >> --- a/ldso/ldso/i386/elfinterp.c
> >> +++ b/ldso/ldso/i386/elfinterp.c
> >> @@ -175,7 +175,9 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct
> >> dyn_elf *scope,
> >>      symbol_addr = 0;
> >>      symname = strtab + symtab[symtab_index].st_name;
> >>
> >> -    if (symtab_index) {
> >> +    if (symtab_index &&
> >> +        (ELF32_ST_VISIBILITY(symtab[symtab_index].st_other)
> >> +         != STV_PROTECTED)) {
> >>          symbol_addr = (unsigned long)_dl_find_hash(symname, scope, tpnt,
> >>                                 elf_machine_type_class(reloc_type),
> >> &tls_tpnt);
> >>
> >>
> >
> > Does not seem to work as expected. When using this, and getting the
> > case when pthread_self is being forwarded via libc (so we end up using
> > relocation of protected __pthread_self in nptl).
> >
> > where
> > #0  0x0000964d in ?? ()
> > #1  0xb785302f in pthread_self () at libpthread/nptl/forward.c:137
> > #2  0xb77b66be in plugin_main () from ./plugin.so
> > #3  0xb7876672 in main () from /home/ncopa/pthread/test
> >
> > But the symbol should is actually located at:
> >
> > (gdb) p __pthread_self
> > $3 = {pthread_t (void)} 0xb77c264d <__pthread_self>
> >
> > Smells like we did not add the base address.
>
> We are missing a:
>    DL_FIND_HASH_VALUE(tpnt, type_class, sym);
> that turns into:
>    DL_RELOC_ADDR ((SYM)->st_value, (TPNT)->loadaddr)
>
> # define DL_RELOC_ADDR(LOADADDR, ADDR) \
>         ((LOADADDR) + (ADDR))
>
> That is done implicitly by the _dl_find_hash.
>
> I wonder if we can just simply add this to the else
> block, or if need to make the protected symbol case
> separate.

Yes, almost. See powerpc for a clue.
The
    case R_386_RELATIVE:
	*reloc_addr += (unsigned long)tpnt->loadaddr;
	break;
is really ugly

I guess you could do:

...
if (symtab_index && ...) {

} else {
  symbol_addr = tpnt->loadaddr + symtab[symtab_index].st_value;
  tls_tpnt = tpnt;
}
...

case R_386_RELATIVE:
			*reloc_addr += symbol_addr;



More information about the uClibc mailing list