2001-02-08 H.J. Lu <hjl@gnu.org>
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 9 Feb 2001 06:58:59 +0000 (06:58 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 9 Feb 2001 06:58:59 +0000 (06:58 +0000)
* elf32-i386.c (elf_i386_check_relocs): Reserve R_386_PC32
relocation entries for weak definitions when building DSO with
-Bsymbolic.

bfd/ChangeLog
bfd/elf32-i386.c

index f64124e..d18a16e 100644 (file)
@@ -1,3 +1,9 @@
+2001-02-08  H.J. Lu  <hjl@gnu.org>
+
+       * elf32-i386.c (elf_i386_check_relocs): Reserve R_386_PC32
+       relocation entries for weak definitions when building DSO with
+       -Bsymbolic.
+
 2001-02-08  Richard Henderson  <rth@redhat.com>
 
        * elf64-alpha.c (alpha_elf_dynamic_symbol_p): Respect weakness
index b433c25..4ad2c2b 100644 (file)
@@ -643,16 +643,19 @@ elf_i386_check_relocs (abfd, info, sec, relocs)
             including in the link (i.e., DEF_REGULAR is set).  At
             this point we have not seen all the input files, so it is
             possible that DEF_REGULAR is not set now but will be set
-            later (it is never cleared).  We account for that
-            possibility below by storing information in the
-            pcrel_relocs_copied field of the hash table entry.
-            A similar situation occurs when creating shared libraries
-            and symbol visibility changes render the symbol local.  */
+            later (it is never cleared).  In case of a weak definition,
+            DEF_REGULAR may be cleared later by a strong definition in
+            a shared library. We account for that possibility below by
+            storing information in the relocs_copied field of the hash
+            table entry.  A similar situation occurs when creating
+            shared libraries and symbol visibility changes render the
+            symbol local.  */
          if (info->shared
              && (sec->flags & SEC_ALLOC) != 0
              && (ELF32_R_TYPE (rel->r_info) != R_386_PC32
                  || (h != NULL
                      && (! info->symbolic
+                         || h->root.type == bfd_link_hash_defweak
                          || (h->elf_link_hash_flags
                              & ELF_LINK_HASH_DEF_REGULAR) == 0))))
            {