2003-05-07 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 8 May 2003 13:55:27 +0000 (13:55 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 8 May 2003 13:55:27 +0000 (13:55 +0000)
* elfxx-ia64.c (_bfd_elf_link_hash_hide_symbol): Also clear the
want_plt field.
(elfNN_ia64_relocate_section): Don't do dynamic symbol lookup
for symbols with non-default visibility.

bfd/ChangeLog
bfd/elfxx-ia64.c

index 8944e3f98d706b687a64ecfdc97af649a137a909..59aba2e29e96938623b114a917245b6181f64665 100644 (file)
@@ -1,3 +1,10 @@
+2003-05-07  H.J. Lu <hongjiu.lu@intel.com>
+
+       * elfxx-ia64.c (_bfd_elf_link_hash_hide_symbol): Also clear the
+       want_plt field.
+       (elfNN_ia64_relocate_section): Don't do dynamic symbol lookup
+       for symbols with non-default visibility.
+
 2003-05-07  H.J. Lu <hongjiu.lu@intel.com>
 
        * elflink.h (elf_link_check_versioned_symbol): Also handle the
index 31f05e9606c749fdf0f7ec32f13cd33c9e948290..8a322b9174c914bb6ef4c97f1410f22c28724ac8 100644 (file)
@@ -1792,7 +1792,10 @@ elfNN_ia64_hash_hide_symbol (info, xh, force_local)
   _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
 
   for (dyn_i = h->info; dyn_i; dyn_i = dyn_i->next)
-    dyn_i->want_plt2 = 0;
+    {
+      dyn_i->want_plt2 = 0;
+      dyn_i->want_plt = 0;
+    }
 }
 
 /* Create the derived linker hash table.  The IA-64 ELF port uses this
@@ -3890,6 +3893,7 @@ elfNN_ia64_relocate_section (output_bfd, info, input_bfd, input_section,
       asection *sym_sec;
       bfd_byte *hit_addr;
       bfd_boolean dynamic_symbol_p;
+      bfd_boolean local_symbol_p;
       bfd_boolean undef_weak_ref;
 
       r_type = ELFNN_R_TYPE (rel->r_info);
@@ -4001,6 +4005,11 @@ elfNN_ia64_relocate_section (output_bfd, info, input_bfd, input_section,
       hit_addr = contents + rel->r_offset;
       value += rel->r_addend;
       dynamic_symbol_p = elfNN_ia64_dynamic_symbol_p (h, info);
+      /* Is this symbol locally defined? A protected symbol is locallly
+        defined. But its function descriptor may not. Use it with
+        caution.  */
+      local_symbol_p = (! dynamic_symbol_p
+                       || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT);
 
       switch (r_type)
        {
@@ -4033,7 +4042,7 @@ elfNN_ia64_relocate_section (output_bfd, info, input_bfd, input_section,
              /* If we don't need dynamic symbol lookup, find a
                 matching RELATIVE relocation.  */
              dyn_r_type = r_type;
-             if (dynamic_symbol_p)
+             if (! local_symbol_p)
                {
                  dynindx = h->dynindx;
                  addend = rel->r_addend;
@@ -4362,7 +4371,7 @@ elfNN_ia64_relocate_section (output_bfd, info, input_bfd, input_section,
 
              /* If we don't need dynamic symbol lookup, install two
                 RELATIVE relocations.  */
-             if (! dynamic_symbol_p)
+             if (local_symbol_p)
                {
                  unsigned int dyn_r_type;