* elf32-frv.c (elf32_frv_relocate_section): Discard dynamic relocs
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 8 May 2007 06:09:30 +0000 (06:09 +0000)
committerAlexandre Oliva <aoliva@redhat.com>
Tue, 8 May 2007 06:09:30 +0000 (06:09 +0000)
for which _bfd_elf_section_offset returns -1.

bfd/ChangeLog
bfd/elf32-frv.c

index b694155..60d9d64 100644 (file)
@@ -1,3 +1,8 @@
+2007-05-08  Alexandre Oliva  <aoliva@redhat.com>
+
+       * elf32-frv.c (elf32_frv_relocate_section): Discard dynamic relocs
+       for which _bfd_elf_section_offset returns -1.
+
 2007-05-08  Alan Modra  <amodra@bigpond.net.au>
 
        * elf32-spu.c (spu_elf_size_stubs): Use "void *" for psyms.
index 3f0a173..742f7d3 100644 (file)
@@ -3644,6 +3644,8 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
                                                input_section->output_section)
                         & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
                      {
+                       bfd_vma offset;
+
                        if (_frvfdpic_osec_readonly_p (output_bfd,
                                                       input_section
                                                       ->output_section))
@@ -3654,22 +3656,27 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
                               name, input_bfd, input_section, rel->r_offset);
                            return FALSE;
                          }
-                       _frvfdpic_add_rofixup (output_bfd,
-                                              frvfdpic_gotfixup_section
-                                              (info),
-                                              _bfd_elf_section_offset
-                                              (output_bfd, info,
-                                               input_section, rel->r_offset)
-                                              + input_section
-                                              ->output_section->vma
-                                              + input_section->output_offset,
-                                              picrel);
+
+                       offset = _bfd_elf_section_offset
+                         (output_bfd, info,
+                          input_section, rel->r_offset);
+
+                       if (offset != (bfd_vma)-1)
+                         _frvfdpic_add_rofixup (output_bfd,
+                                                frvfdpic_gotfixup_section
+                                                (info),
+                                                offset + input_section
+                                                ->output_section->vma
+                                                + input_section->output_offset,
+                                                picrel);
                      }
                  }
                else if ((bfd_get_section_flags (output_bfd,
                                                 input_section->output_section)
                          & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
                  {
+                   bfd_vma offset;
+
                    if (_frvfdpic_osec_readonly_p (output_bfd,
                                                   input_section
                                                   ->output_section))
@@ -3680,15 +3687,18 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
                           name, input_bfd, input_section, rel->r_offset);
                        return FALSE;
                      }
-                   _frvfdpic_add_dyn_reloc (output_bfd,
-                                            frvfdpic_gotrel_section (info),
-                                            _bfd_elf_section_offset
-                                            (output_bfd, info,
-                                             input_section, rel->r_offset)
-                                            + input_section
-                                            ->output_section->vma
-                                            + input_section->output_offset,
-                                            r_type, dynindx, addend, picrel);
+
+                   offset = _bfd_elf_section_offset
+                     (output_bfd, info,
+                      input_section, rel->r_offset);
+
+                   if (offset != (bfd_vma)-1)
+                     _frvfdpic_add_dyn_reloc (output_bfd,
+                                              frvfdpic_gotrel_section (info),
+                                              offset + input_section
+                                              ->output_section->vma
+                                              + input_section->output_offset,
+                                              r_type, dynindx, addend, picrel);
                  }
                else
                  addend += frvfdpic_got_section (info)->output_section->vma;
@@ -3769,25 +3779,27 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
                      }
                    if (!h || h->root.type != bfd_link_hash_undefweak)
                      {
-                       _frvfdpic_add_rofixup (output_bfd,
-                                              frvfdpic_gotfixup_section
-                                              (info),
-                                              _bfd_elf_section_offset
-                                              (output_bfd, info,
-                                               input_section, rel->r_offset)
-                                              + input_section
-                                              ->output_section->vma
-                                              + input_section->output_offset,
-                                              picrel);
-                       if (r_type == R_FRV_FUNCDESC_VALUE)
-                         _frvfdpic_add_rofixup
-                           (output_bfd,
-                            frvfdpic_gotfixup_section (info),
-                            _bfd_elf_section_offset
-                            (output_bfd, info,
-                             input_section, rel->r_offset)
-                            + input_section->output_section->vma
-                            + input_section->output_offset + 4, picrel);
+                       bfd_vma offset = _bfd_elf_section_offset
+                         (output_bfd, info,
+                          input_section, rel->r_offset);
+
+                       if (offset != (bfd_vma)-1)
+                         {
+                           _frvfdpic_add_rofixup (output_bfd,
+                                                  frvfdpic_gotfixup_section
+                                                  (info),
+                                                  offset + input_section
+                                                  ->output_section->vma
+                                                  + input_section->output_offset,
+                                                  picrel);
+                           if (r_type == R_FRV_FUNCDESC_VALUE)
+                             _frvfdpic_add_rofixup
+                               (output_bfd,
+                                frvfdpic_gotfixup_section (info),
+                                offset
+                                + input_section->output_section->vma
+                                + input_section->output_offset + 4, picrel);
+                         }
                      }
                  }
              }
@@ -3797,6 +3809,8 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
                                            input_section->output_section)
                     & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
                  {
+                   bfd_vma offset;
+
                    if (_frvfdpic_osec_readonly_p (output_bfd,
                                                   input_section
                                                   ->output_section))
@@ -3807,15 +3821,18 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
                           name, input_bfd, input_section, rel->r_offset);
                        return FALSE;
                      }
-                   _frvfdpic_add_dyn_reloc (output_bfd,
-                                            frvfdpic_gotrel_section (info),
-                                            _bfd_elf_section_offset
-                                            (output_bfd, info,
-                                             input_section, rel->r_offset)
-                                            + input_section
-                                            ->output_section->vma
-                                            + input_section->output_offset,
-                                            r_type, dynindx, addend, picrel);
+
+                   offset = _bfd_elf_section_offset
+                     (output_bfd, info,
+                      input_section, rel->r_offset);
+
+                   if (offset != (bfd_vma)-1)
+                     _frvfdpic_add_dyn_reloc (output_bfd,
+                                              frvfdpic_gotrel_section (info),
+                                              offset + input_section
+                                              ->output_section->vma
+                                              + input_section->output_offset,
+                                              r_type, dynindx, addend, picrel);
                  }
                else if (osec)
                  addend += osec->output_section->vma;