* elfxx-ia64.c (elfNN_ia64_relocate_section): Test r_symndx rather
authorAlan Modra <amodra@gmail.com>
Wed, 21 Nov 2001 14:58:26 +0000 (14:58 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 21 Nov 2001 14:58:26 +0000 (14:58 +0000)
than sym_sec->output_section to detect relocs against discarded
sections.

bfd/ChangeLog
bfd/elfxx-ia64.c

index 5d7dae175abc65810b7776541c8e30439aec97af..335397477f7568c96587e3bae860f81ecd65657a 100644 (file)
@@ -1,3 +1,9 @@
+2001-11-21  Alan Modra  <amodra@bigpond.net.au>
+
+       * elfxx-ia64.c (elfNN_ia64_relocate_section): Test r_symndx rather
+       than sym_sec->output_section to detect relocs against discarded
+       sections.
+
 2001-11-19  H.J. Lu  <hjl@gnu.org>
 
        * elflink.h (elf_link_input_bfd): Assert r_symndx != 0 when
index 7f4a9910873849fe2719325897f20cab816d85f2..05ae66840d0c58b7587b5390e75b97f26e58a197 100644 (file)
@@ -3835,47 +3835,48 @@ elfNN_ia64_relocate_section (output_bfd, info, input_bfd, input_section,
        case R_IA64_SEGREL32LSB:
        case R_IA64_SEGREL64MSB:
        case R_IA64_SEGREL64LSB:
-         {
-           struct elf_segment_map *m;
-           Elf_Internal_Phdr *p;
-
-           /* Find the segment that contains the output_section.  */
-           for (m = elf_tdata (output_bfd)->segment_map,
-                  p = elf_tdata (output_bfd)->phdr;
-                m != NULL;
-                m = m->next, p++)
-             {
-               int i;
-               for (i = m->count - 1; i >= 0; i--)
-                 if (m->sections[i] == sym_sec->output_section)
+         if (r_symndx == 0)
+           {
+             /* If the input section was discarded from the output, then
+                do nothing.  */
+             r = bfd_reloc_ok;
+           }
+         else
+           {
+             struct elf_segment_map *m;
+             Elf_Internal_Phdr *p;
+
+             /* Find the segment that contains the output_section.  */
+             for (m = elf_tdata (output_bfd)->segment_map,
+                    p = elf_tdata (output_bfd)->phdr;
+                  m != NULL;
+                  m = m->next, p++)
+               {
+                 int i;
+                 for (i = m->count - 1; i >= 0; i--)
+                   if (m->sections[i] == sym_sec->output_section)
+                     break;
+                 if (i >= 0)
                    break;
-               if (i >= 0)
-                 break;
-             }
-
-           if (m == NULL)
-             {
-               /* If the input section was discarded from the output, then
-                  do nothing.  */
+               }
 
-               if (bfd_is_abs_section (sym_sec->output_section))
-                 r = bfd_reloc_ok;
-               else
+             if (m == NULL)
+               {
                  r = bfd_reloc_notsupported;
-             }
-           else
-             {
-               /* The VMA of the segment is the vaddr of the associated
-                  program header.  */
-               if (value > p->p_vaddr)
-                 value -= p->p_vaddr;
-               else
-                 value = 0;
-               r = elfNN_ia64_install_value (output_bfd, hit_addr, value,
-                                             r_type);
-             }
-           break;
-         }
+               }
+             else
+               {
+                 /* The VMA of the segment is the vaddr of the associated
+                    program header.  */
+                 if (value > p->p_vaddr)
+                   value -= p->p_vaddr;
+                 else
+                   value = 0;
+                 r = elfNN_ia64_install_value (output_bfd, hit_addr, value,
+                                               r_type);
+               }
+             break;
+           }
 
        case R_IA64_SECREL32MSB:
        case R_IA64_SECREL32LSB: