OSDN Git Service

Merge commit 'origin/master' into prelink
authorCarmelo Amoroso <carmelo.amoroso@st.com>
Fri, 24 Sep 2010 07:02:41 +0000 (09:02 +0200)
committerCarmelo Amoroso <carmelo.amoroso@st.com>
Fri, 24 Sep 2010 07:02:41 +0000 (09:02 +0200)
Conflicts:

ldso/ldso/sh/elfinterp.c

Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
1  2 
ldso/ldso/sh/elfinterp.c

@@@ -167,29 -166,32 +167,36 @@@ _dl_do_reloc (struct elf_resolve *tpnt
        reloc_type = ELF32_R_TYPE(rpnt->r_info);
        symtab_index = ELF32_R_SYM(rpnt->r_info);
        symbol_addr = 0;
-       symname = strtab + symtab[symtab_index].st_name;
  
        if (symtab_index) {
-               symbol_addr = (unsigned long) _dl_find_hash(symname, scope, tpnt, &current_value,
-                                                           elf_machine_type_class(reloc_type), &tls_tpnt);
-               /*
-                * We want to allow undefined references to weak symbols - this might
-                * have been intentional.  We should not be linking local symbols
-                * here, so all bases should be covered.
-                */
-               if (!symbol_addr
-                       && (ELF_ST_TYPE(symtab[symtab_index].st_info) != STT_TLS)
-                       && (ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK)) {
-                       _dl_dprintf(2, "%s: can't resolve symbol '%s'\n",
-                                   _dl_progname, strtab + symtab[symtab_index].st_name);
-                       /* Let the caller to handle the error: it may be non fatal if called from dlopen */
-                       return 1;
-               }
+               symname = strtab + symtab[symtab_index].st_name;
+               if (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);
++                      != STV_PROTECTED) {
++                      symbol_addr = (unsigned long) _dl_find_hash(symname, scope, tpnt, &current_value,
++                                                                      elf_machine_type_class(reloc_type), &tls_tpnt);
+                       /*
+                        * We want to allow undefined references to weak symbols - this might
+                        * have been intentional.  We should not be linking local symbols
+                        * here, so all bases should be covered.
+                        */
+                       if (!symbol_addr
+                               && (ELF_ST_TYPE(symtab[symtab_index].st_info) != STT_TLS)
+                               && (ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK)) {
+                               _dl_dprintf(2, "%s: can't resolve symbol '%s'\n",
 -                                          _dl_progname, strtab + symtab[symtab_index].st_name);
++                                              _dl_progname, strtab + symtab[symtab_index].st_name);
+                               /* Let the caller to handle the error: it may be non fatal if called from dlopen */
+                               return 1;
+                       }
+               } else
+                       /* Resolve protected symbols locally */
+                       symbol_addr = DL_FIND_HASH_VALUE(tpnt, elf_machine_type_class(reloc_type),
+                                                                                       &symtab[symtab_index]);
++
 +              if (_dl_trace_prelink)
 +                      _dl_debug_lookup (symname, tpnt, &symtab[symtab_index],
 +                                                      &current_value, elf_machine_type_class(reloc_type));
        }
  
  #if defined (__SUPPORT_LD_DEBUG__)