aboutsummaryrefslogtreecommitdiff
path: root/bfd/cofflink.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2003-10-07 08:49:11 +0000
committerNathan Sidwell <nathan@codesourcery.com>2003-10-07 08:49:11 +0000
commitcd339148dea20e4fffc4a184329a978c7894a9e5 (patch)
treea34c3c9a5252190f26d3098f074f6ac7b9f2d4a1 /bfd/cofflink.c
parent2f9626f3fd613ff1f0356f426d8b3b30e8acf766 (diff)
downloadgdb-cd339148dea20e4fffc4a184329a978c7894a9e5.zip
gdb-cd339148dea20e4fffc4a184329a978c7894a9e5.tar.gz
gdb-cd339148dea20e4fffc4a184329a978c7894a9e5.tar.bz2
* coffcode.h (coff_set_alignment_hook): With PE_COFF reloc
overflow, set reloc start position to after the count reloc. Subtract one from num relocs. Give error on 0xffff relocs and no overflow. * cofflink.c (_bfd_coff_final_link): Deal with PE_COFF reloc overflow. * peXXigen.c (_bfd_XXi_swap_scnhdr_out): Do overflow if >= 0xffff.
Diffstat (limited to 'bfd/cofflink.c')
-rw-r--r--bfd/cofflink.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/bfd/cofflink.c b/bfd/cofflink.c
index c1eee1b..1b059f6 100644
--- a/bfd/cofflink.c
+++ b/bfd/cofflink.c
@@ -1028,10 +1028,27 @@ _bfd_coff_final_link (bfd *abfd,
bfd_coff_swap_reloc_out (abfd, irel, erel);
}
- if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
- || (bfd_bwrite (external_relocs,
- (bfd_size_type) relsz * o->reloc_count, abfd)
- != (bfd_size_type) relsz * o->reloc_count))
+ if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0)
+ goto error_return;
+ if (obj_pe (abfd) && o->reloc_count >= 0xffff)
+ {
+ /* In PE COFF, write the count of relocs as the first
+ reloc. The header overflow bit will be set
+ elsewhere. */
+ struct internal_reloc incount;
+ bfd_byte *excount = (bfd_byte *)bfd_malloc (relsz);
+
+ memset (&incount, 0, sizeof (incount));
+ incount.r_vaddr = o->reloc_count + 1;
+ bfd_coff_swap_reloc_out (abfd, (PTR) &incount, (PTR) excount);
+ if (bfd_bwrite (excount, relsz, abfd) != relsz)
+ /* We'll leak, but it's an error anyway. */
+ goto error_return;
+ free (excount);
+ }
+ if (bfd_bwrite (external_relocs,
+ (bfd_size_type) relsz * o->reloc_count, abfd)
+ != (bfd_size_type) relsz * o->reloc_count)
goto error_return;
}