* elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Reinstate bypass
authorEric Botcazou <ebotcazou@libertysurf.fr>
Tue, 31 Jan 2006 22:42:21 +0000 (22:42 +0000)
committerEric Botcazou <ebotcazou@libertysurf.fr>
Tue, 31 Jan 2006 22:42:21 +0000 (22:42 +0000)
for 32-bit relocs overflow.

bfd/ChangeLog
bfd/elfxx-sparc.c

index ce4406952f3e1284a777b7d0f42e211c1ee6a074..3a0bb0af8e5882f1048bc21bb4b813d4dbd6308b 100644 (file)
@@ -1,3 +1,8 @@
+2006-01-31  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       * elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Reinstate bypass
+       for 32-bit relocs overflow.
+
 2006-01-27  Paul Brook  <paul@codesourcery.com>
 
        * elf32-arm.c (elf32_arm_get_symbol_type): Allow STT_TLS thumb
index e587a675d80c09ae8c92468fa2868ebd8cfcf2f6..5e8fb2028c5e0699410206c6de01088b36ff9398 100644 (file)
@@ -3357,6 +3357,21 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
              {
                const char *name;
 
+               /* The Solaris native linker silently disregards overflows. 
+                  We don't, but this breaks stabs debugging info, whose
+                  relocations are only 32-bits wide.  Ignore overflows in
+                  this case and also for discarded entries.  */
+               if ((r_type == R_SPARC_32 || r_type == R_SPARC_DISP32)
+                   && (((input_section->flags & SEC_DEBUGGING) != 0
+                        && strcmp (bfd_section_name (input_bfd,
+                                                     input_section),
+                                   ".stab") == 0)
+                       || _bfd_elf_section_offset (output_bfd, info,
+                                                   input_section,
+                                                   rel->r_offset)
+                            == (bfd_vma)-1))
+                 break;
+
                if (h != NULL)
                  name = NULL;
                else