diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2003-10-07 08:49:11 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@codesourcery.com> | 2003-10-07 08:49:11 +0000 |
commit | cd339148dea20e4fffc4a184329a978c7894a9e5 (patch) | |
tree | a34c3c9a5252190f26d3098f074f6ac7b9f2d4a1 /bfd/cofflink.c | |
parent | 2f9626f3fd613ff1f0356f426d8b3b30e8acf766 (diff) | |
download | gdb-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.c | 25 |
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; } |