* elflink.h (elf_link_add_object_symbols): Only add a weak
authorIan Lance Taylor <ian@airs.com>
Fri, 13 Dec 1996 02:29:37 +0000 (02:29 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 13 Dec 1996 02:29:37 +0000 (02:29 +0000)
symbol if the real definition is in the dynamic symbol table.
After finding the real definition, then, if it is dynamic, add the
weak symbol to the dynamic symbol table.
PR 11244.

bfd/ChangeLog
bfd/elflink.h

index d7f8b7649c732760f77fdaecb681ca965d6fe7b5..1c0014f6c6f6463c7cb191b6832dbe69bb2f60c7 100644 (file)
@@ -5,6 +5,11 @@ Thu Dec 12 15:07:20 1996  Michael Meissner  <meissner@tiktok.cygnus.com>
 
 Thu Dec 12 14:55:41 1996  Ian Lance Taylor  <ian@cygnus.com>
 
+       * elflink.h (elf_link_add_object_symbols): Only add a weak
+       symbol if the real definition is in the dynamic symbol table.
+       After finding the real definition, then, if it is dynamic, add the
+       weak symbol to the dynamic symbol table.
+
        * coff-aux.c (coff_m68k_aux_link_add_one_symbol): Make static.
 
        * ppcboot.c (ppcboot_set_arch_mach): Don't define; it's a
index 8be2f2d6ab7ae596413ed8ca9184748aebc66f59..5097b4c199f4c11f09ad2f1c875dce9645d55074 100644 (file)
@@ -810,8 +810,7 @@ elf_link_add_object_symbols (abfd, info)
             reference or definition we just found.  Keep a count of
             the number of dynamic symbols we find.  A dynamic symbol
             is one which is referenced or defined by both a regular
-            object and a shared object, or one which is referenced or
-            defined by more than one shared object.  */
+            object and a shared object.  */
          old_flags = h->elf_link_hash_flags;
          dynsym = false;
          if (! dynamic)
@@ -834,8 +833,8 @@ elf_link_add_object_symbols (abfd, info)
              if ((old_flags & (ELF_LINK_HASH_DEF_REGULAR
                                | ELF_LINK_HASH_REF_REGULAR)) != 0
                  || (h->weakdef != NULL
-                     && (old_flags & (ELF_LINK_HASH_DEF_DYNAMIC
-                                      | ELF_LINK_HASH_REF_DYNAMIC)) != 0))
+                     && ! new_weakdef
+                     && h->weakdef->dynindx != -1))
                dynsym = true;
            }
 
@@ -912,6 +911,18 @@ elf_link_add_object_symbols (abfd, info)
                    goto error_return;
                }
 
+             /* If the real definition is in the list of dynamic
+                 symbols, make sure the weak definition is put there
+                 as well.  If we don't do this, then the dynamic
+                 loader might not merge the entries for the real
+                 definition and the weak definition.  */
+             if (h->dynindx != -1
+                 && hlook->dynindx == -1)
+               {
+                 if (! _bfd_elf_link_record_dynamic_symbol (info, hlook))
+                   goto error_return;
+               }
+
              break;
            }
        }