* elf64-x86-64.c (elf64_x86_64_relocate_section): Fix linking of
authorAndreas Jaeger <aj@suse.de>
Thu, 21 Jun 2001 16:33:14 +0000 (16:33 +0000)
committerAndreas Jaeger <aj@suse.de>
Thu, 21 Jun 2001 16:33:14 +0000 (16:33 +0000)
shared libraries.

bfd/ChangeLog
bfd/elf64-x86-64.c

index bf87bd5..201938b 100644 (file)
@@ -1,3 +1,8 @@
+2001-06-20  Bo Thorsen  <bo@suse.co.uk>
+
+       * elf64-x86-64.c (elf64_x86_64_relocate_section): Fix linking of
+       shared libraries.
+
 2001-06-18  Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
 
        * configure.host (mips64-*-linux): Reformat.
@@ -24,7 +29,7 @@
         elf_backend_emit_relocs and elf_backend_count_relocs.
         * elflink.h (elf_link_size_reloc_section): Make the hash table
         big enough to hold the relocs counted by either reloc_count or
-        o->reloc_count.  
+        o->reloc_count.
         (elf_bfd_final_link) emit_relocs: New boolean, set if relocs
         should be emitted, either because of a command line option
         stored in the info structure or because the target provides a
@@ -72,7 +77,7 @@
 
        * elf32-mips.c (mips_elf_link_hash_entry): Add a new field,
        readonly_reloc, to record if a relocation in the .rel.dyn
-       section is against a read-only section. 
+       section is against a read-only section.
        (mips_elf_link_hash_newfunc): Initialize the readonly_reloc
        field to false.
        (_bfd_mips_elf_check_relocs): Record if there is a relocation
index 57d4005..7b37d96 100644 (file)
@@ -1442,7 +1442,9 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
        case R_X86_64_PC8:
        case R_X86_64_PC16:
        case R_X86_64_PC32:
-         if (h == NULL)
+         if (h == NULL || h->dynindx == -1
+             || (info->symbolic
+                 && h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
            break;
          /* Fall through.  */
        case R_X86_64_8:
@@ -1451,15 +1453,7 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
        case R_X86_64_64:
          /* FIXME: The ABI says the linker should make sure the value is
             the same when it's zeroextended to 64 bit.  */
-         if (info->shared
-             && (input_section->flags & SEC_ALLOC) != 0
-             && ((r_type != R_X86_64_PC8
-                  && r_type != R_X86_64_PC16
-                  && r_type != R_X86_64_PC32)
-                 || (! info->symbolic
-                     || (h->elf_link_hash_flags
-                         & ELF_LINK_HASH_DEF_REGULAR) == 0)))
-
+         if (info->shared && (input_section->flags & SEC_ALLOC) != 0)
            {
              Elf_Internal_Rela outrel;
              boolean skip, relocate;
@@ -1563,10 +1557,10 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
                          BFD_ASSERT (indx > 0);
                        }
 
-                     relocate = false;
+                     relocate = false;
                      outrel.r_info = ELF64_R_INFO (indx, r_type);
-                     outrel.r_addend = relocation + rela->r_addend;
-                   }
+                     outrel.r_addend = relocation + rela->r_addend;
+                   }
 
                }