From e9168c1e2b14c89a5701688c93d42a6c9ae4bb12 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 8 Jul 2002 05:34:08 +0000 Subject: [PATCH] * cofflink.c (_bfd_coff_final_link): On PE COFF systems, take into account the impact of relocation count overflow when computing section offsets. * coffcode.h (coff_write_relocs): Use obj_pe when deciding whether or not to apply the PE COFF reloc overflow handling. Fix a fencepost error in deciding whether or not to use that technique. --- bfd/ChangeLog | 10 ++++++++++ bfd/coffcode.h | 6 +++--- bfd/cofflink.c | 4 ++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0e66cda7c8..2e442bafbb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2002-07-07 Mark Mitchell + Alan Modra + + * cofflink.c (_bfd_coff_final_link): On PE COFF systems, take into + account the impact of relocation count overflow when computing + section offsets. + * coffcode.h (coff_write_relocs): Use obj_pe when deciding whether + or not to apply the PE COFF reloc overflow handling. Fix a + fencepost error in deciding whether or not to use that technique. + 2002-07-07 Alan Modra * elf-bfd.h (struct elf_reloc_cookie): Remove locsym_shndx, diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 6040026c9e..bb777aaaf1 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -2394,7 +2394,7 @@ coff_write_relocs (abfd, first_undef) return false; #ifdef COFF_WITH_PE - if (s->reloc_count > 0xffff) + if (obj_pe (abfd) && s->reloc_count >= 0xffff) { /* encode real count here as first reloc */ struct internal_reloc n; @@ -3420,7 +3420,7 @@ coff_write_object_contents (abfd) { #ifdef COFF_WITH_PE /* we store the actual reloc count in the first reloc's addr */ - if (current->reloc_count > 0xffff) + if (obj_pe (abfd) && current->reloc_count >= 0xffff) reloc_count ++; #endif reloc_count += current->reloc_count; @@ -3451,7 +3451,7 @@ coff_write_object_contents (abfd) reloc_base += current->reloc_count * bfd_coff_relsz (abfd); #ifdef COFF_WITH_PE /* extra reloc to hold real count */ - if (current->reloc_count > 0xffff) + if (obj_pe (abfd) && current->reloc_count >= 0xffff) reloc_base += bfd_coff_relsz (abfd); #endif } diff --git a/bfd/cofflink.c b/bfd/cofflink.c index 32200a83a6..eb9388fc71 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -757,6 +757,10 @@ _bfd_coff_final_link (abfd, info) o->flags |= SEC_RELOC; o->rel_filepos = rel_filepos; rel_filepos += o->reloc_count * relsz; + /* In PE COFF, if there are at least 0xffff relocations an + extra relocation will be written out to encode the count. */ + if (obj_pe (abfd) && o->reloc_count >= 0xffff) + rel_filepos += relsz; } if (bfd_coff_long_section_names (abfd)