2000-05-30 H.J. Lu <hjl@gnu.org>
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 30 May 2000 20:51:36 +0000 (20:51 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 30 May 2000 20:51:36 +0000 (20:51 +0000)
* elflink.c (_bfd_elf_link_record_dynamic_symbol): Clear the
visibility bits if the symbol is undefined. Correctly handle
weak undefined symbols with hidden and internal attributes.

* elflink.h (elf_link_add_object_symbols): Always turn the
symbol into local if it has the hidden or internal attribute.

bfd/ChangeLog
bfd/elflink.c
bfd/elflink.h

index 0884d78..08eea2a 100644 (file)
@@ -1,3 +1,12 @@
+2000-05-30  H.J. Lu  <hjl@gnu.org>
+
+       * elflink.c (_bfd_elf_link_record_dynamic_symbol): Clear the
+       visibility bits if the symbol is undefined. Correctly handle
+       weak undefined symbols with hidden and internal attributes.
+
+       * elflink.h (elf_link_add_object_symbols): Always turn the
+       symbol into local if it has the hidden or internal attribute.
+
 2000-05-29  Philip Blundell  <philb@gnu.org>
 
        * ppcboot.c:  Add packed attribute if compiling with GCC.
index 1b1548a..c593e49 100644 (file)
@@ -235,10 +235,16 @@ _bfd_elf_link_record_dynamic_symbol (info, h)
              
              (*info->callbacks->undefined_symbol)
                (info, name, abfd, bfd_und_section_ptr, 0, true);
+
+             /* We have flaged a fatal error. We now treat this as
+                a normal symbol to avoid further error messages. */
+             h->other ^= ELF_ST_VISIBILITY (h->other);
+           }
+         else if (h->root.type != bfd_link_hash_undefweak)
+           {
+             h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
+             return true;
            }
-         
-         h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
-         return true;
 
        default:
          break;
index f1dab70..d09ad17 100644 (file)
@@ -890,7 +890,6 @@ elf_link_add_object_symbols (abfd, info)
   Elf_External_Sym *esym;
   Elf_External_Sym *esymend;
   struct elf_backend_data *bed;
-  boolean visibility_changed = false;
 
   bed = get_elf_backend_data (abfd);
   add_symbol_hook = bed->elf_add_symbol_hook;
@@ -1581,10 +1580,7 @@ elf_link_add_object_symbols (abfd, info)
              unsigned char symvis = ELF_ST_VISIBILITY (sym.st_other);
              
              if (symvis && (hvis > symvis || hvis == 0))
-               {
-                 visibility_changed = true;
-                 h->other = sym.st_other;
-               }
+               h->other = sym.st_other;
              
              /* If neither has visibility, use the st_other of the
                 definition.  This is an arbitrary choice, since the
@@ -1855,7 +1851,7 @@ elf_link_add_object_symbols (abfd, info)
                    goto error_return;
                }
            }
-         else if (dynsym && h->dynindx != -1 && visibility_changed)
+         else if (dynsym && h->dynindx != -1)
            /* If the symbol already has a dynamic index, but
               visibility says it should not be visible, turn it into
               a local symbol.  */