OSDN Git Service

ldso/i386: support protected symbols
authorJoakim Tjernlund <joakim.tjernlund@transmode.se>
Fri, 16 Apr 2010 12:37:40 +0000 (15:37 +0300)
committerAustin Foxley <austinf@cetoncorp.com>
Fri, 16 Apr 2010 17:11:57 +0000 (10:11 -0700)
Make sure protected symbols are not overridden by other modules.

Signed-off-by: Joakim Tjernlund <joakim.tjernlund@transmode.se>
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
Signed-off-by: Austin Foxley <austinf@cetoncorp.com>
ldso/ldso/i386/elfinterp.c

index a01c1d0..1e3a2b2 100644 (file)
@@ -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);
 
@@ -188,7 +190,11 @@ _dl_do_reloc(struct elf_resolve *tpnt, struct dyn_elf *scope,
                                        && ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK))
                        return 1;
        } else {
-               symbol_addr = symtab[symtab_index].st_value;
+               if (symtab_index)
+                       symbol_addr = DL_FIND_HASH_VALUE(tpnt, elf_machine_type_class(reloc_type),
+                                                        &symtab[symtab_index]);
+               else
+                       symbol_addr = symtab[symtab_index].st_value;
                tls_tpnt = tpnt;
        }