OSDN Git Service

MIPS LDSO: pass sym_ref parameter to _dl_find_hash() to support PROTECTED symbols
authorMaksim Rayskiy <mrayskiy@broadcom.com>
Fri, 15 Apr 2011 17:25:40 +0000 (10:25 -0700)
committerCarmelo Amoroso <carmelo.amoroso@st.com>
Mon, 18 Apr 2011 06:44:16 +0000 (08:44 +0200)
_dl_find_hash() relies on sym_ref parameter to check if the looked-up symbol
is protected. The code fixes a case when _dl_perform_mips_global_got_relocations()
was calling _dl_find_hash() without providing sym_ref parameter.
The bug was causing hangs if a library exporting non-protected symbol was earlier in
link order than library with the same symbol declared as protected.

Signed-off-by: Maksim Rayskiy <mrayskiy@broadcom.com>
Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
ldso/ldso/mips/elfinterp.c

index 2886f33..82f740d 100644 (file)
@@ -378,8 +378,11 @@ void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt, int lazy)
                                        *got_entry += (unsigned long) tpnt->loadaddr;
                        }
                        else {
+                               struct symbol_ref sym_ref;
+                               sym_ref.sym = sym;
+                               sym_ref.tpnt = NULL;
                                *got_entry = (unsigned long) _dl_find_hash(strtab +
-                                       sym->st_name, tpnt->symbol_scope, tpnt, ELF_RTYPE_CLASS_PLT, NULL);
+                                       sym->st_name, tpnt->symbol_scope, tpnt, ELF_RTYPE_CLASS_PLT, &sym_ref);
                        }
 
                        got_entry++;