2001-03-07 Andreas Jaeger <aj@suse.de>
authorAndreas Jaeger <aj@suse.de>
Wed, 7 Mar 2001 13:49:11 +0000 (13:49 +0000)
committerAndreas Jaeger <aj@suse.de>
Wed, 7 Mar 2001 13:49:11 +0000 (13:49 +0000)
* elf64-x86-64.c (elf64_x86_64_relocate_section): Fix handling of
some relocation values.

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

index 32794be55a4ec2fcd0f21c44a85960f3f802c73c..2667ff9ee243ba0f532341e088a9e93925bd083b 100644 (file)
@@ -1,3 +1,8 @@
+2001-03-07  Andreas Jaeger  <aj@suse.de>
+
+       * elf64-x86-64.c (elf64_x86_64_relocate_section): Fix handling of
+       some relocation values.
+
 2001-03-06  Nick Clifton  <nickc@redhat.com>
 
        * elf32-arm.h (elf32_arm_final_link_relocate): Clear bit zero
index aedd2b8134f18ba57b41e81348df104c799257d1..d797165c3dbdc9882ec00e721be99c848c7bb883 100644 (file)
@@ -1194,7 +1194,41 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
              || h->root.type == bfd_link_hash_defweak)
            {
              sec = h->root.u.def.section;
-             if (sec->output_section == NULL)
+             if (r_type == R_X86_64_GOTPCREL
+                 || (r_type = R_X86_64_PLT32
+                     && splt != NULL
+                     && h->plt.offset != (bfd_vma) -1)
+                 || (r_type = R_X86_64_GOT32
+                     && elf_hash_table (info)->dynamic_sections_created
+                     && (!info->shared
+                         || (! info->symbolic && h->dynindx != -1)
+                         || (h->elf_link_hash_flags
+                             & ELF_LINK_HASH_DEF_REGULAR) == 0))
+                 || (info->shared
+                     && ((! info->symbolic && h->dynindx != -1)
+                         || (h->elf_link_hash_flags
+                             & ELF_LINK_HASH_DEF_REGULAR) == 0)
+                     && ( r_type == R_X86_64_8 ||
+                          r_type == R_X86_64_16 ||
+                           r_type == R_X86_64_32 ||
+                          r_type == R_X86_64_64 ||
+                           r_type == R_X86_64_PC16 ||
+                          r_type == R_X86_64_PC32)
+                      && ((input_section->flags & SEC_ALLOC) != 0
+                          /* DWARF will emit R_X86_64_32 relocations in its
+                             sections against symbols defined externally
+                             in shared libraries.  We can't do anything
+                             with them here.  */
+                          || ((input_section->flags & SEC_DEBUGGING) != 0
+                             && (h->elf_link_hash_flags
+                                 & ELF_LINK_HASH_DEF_DYNAMIC) != 0))))
+               {
+                 /* In these cases, we don't need the relocation
+                     value.  We check specially because in some
+                     obscure cases sec->output_section will be NULL.  */
+                 relocation = 0;
+               }
+             else if (sec->output_section == NULL)
                {
                  (*_bfd_error_handler)
                    (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),