* elflink.c (_bfd_elf_merge_symbol): Treat old definitions from
authorAlan Modra <amodra@gmail.com>
Wed, 22 Dec 2004 03:59:26 +0000 (03:59 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 22 Dec 2004 03:59:26 +0000 (03:59 +0000)
as-needed dynamic libs as undefined.
(elf_link_add_object_symbols): Remove DYN_AS_NEEDED from as-needed
libs when finding they are needed.

bfd/ChangeLog
bfd/elflink.c

index ecce14f437defc82d73b8ceed03feadf3888826e..cfebc7451d1d163d94f147f92dc858607e38686a 100644 (file)
@@ -1,3 +1,10 @@
+2004-12-22  Alan Modra  <amodra@bigpond.net.au>
+
+       * elflink.c (_bfd_elf_merge_symbol): Treat old definitions from
+       as-needed dynamic libs as undefined.
+       (elf_link_add_object_symbols): Remove DYN_AS_NEEDED from as-needed
+       libs when finding they are needed.
+
 2004-12-20  Alan Modra  <amodra@bigpond.net.au>
 
        * elf64-ppc.c (struct ppc64_elf_obj_tdata): Add opd_relocs.
index d46bf418786d29d5b71e6b471d7510c1fd391f2f..a973cd59a342262d137548007e56b32b74770905 100644 (file)
@@ -719,7 +719,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
   int bind;
   bfd *oldbfd;
   bfd_boolean newdyn, olddyn, olddef, newdef, newdyncommon, olddyncommon;
-  bfd_boolean newweak, oldweak;
+  bfd_boolean newweak, oldweak, old_asneeded;
 
   *skip = FALSE;
   *override = FALSE;
@@ -849,6 +849,14 @@ _bfd_elf_merge_symbol (bfd *abfd,
   else
     olddef = TRUE;
 
+  /* If the old definition came from an as-needed dynamic library which
+     wasn't found to be needed, treat the sym as undefined.  */
+  old_asneeded = FALSE;
+  if (newdyn
+      && olddyn
+      && (elf_dyn_lib_class (oldbfd) & DYN_AS_NEEDED) != 0)
+    old_asneeded = TRUE;
+
   /* Check TLS symbol.  */
   if ((ELF_ST_TYPE (sym->st_info) == STT_TLS || h->type == STT_TLS)
       && ELF_ST_TYPE (sym->st_info) != h->type)
@@ -1051,6 +1059,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
 
   if (olddyn
       && olddef
+      && !old_asneeded
       && h->root.type == bfd_link_hash_defined
       && h->def_dynamic
       && (h->root.u.def.section->flags & SEC_ALLOC) != 0
@@ -1102,7 +1111,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
 
   if (newdyn
       && newdef
-      && (olddef
+      && ((olddef && !old_asneeded)
          || (h->root.type == bfd_link_hash_common
              && (newweak
                  || ELF_ST_TYPE (sym->st_info) == STT_FUNC))))
@@ -1152,7 +1161,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
      symbol is a function or is weak.  */
 
   flip = NULL;
-  if (! newdyn
+  if ((!newdyn || old_asneeded)
       && (newdef
          || (bfd_is_com_section (sec)
              && (oldweak
@@ -3937,6 +3946,8 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
                  goto error_free_vers;
                }
 
+             elf_dyn_lib_class (abfd) &= ~DYN_AS_NEEDED;
+
              add_needed = TRUE;
              ret = elf_add_dt_needed_tag (info, soname, add_needed);
              if (ret < 0)