* 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.
This commit is contained in:
parent
d1e122bd6a
commit
e9168c1e2b
|
@ -1,3 +1,13 @@
|
||||||
|
2002-07-07 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
* 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 <amodra@bigpond.net.au>
|
2002-07-07 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
* elf-bfd.h (struct elf_reloc_cookie): Remove locsym_shndx,
|
* elf-bfd.h (struct elf_reloc_cookie): Remove locsym_shndx,
|
||||||
|
|
|
@ -2394,7 +2394,7 @@ coff_write_relocs (abfd, first_undef)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
#ifdef COFF_WITH_PE
|
#ifdef COFF_WITH_PE
|
||||||
if (s->reloc_count > 0xffff)
|
if (obj_pe (abfd) && s->reloc_count >= 0xffff)
|
||||||
{
|
{
|
||||||
/* encode real count here as first reloc */
|
/* encode real count here as first reloc */
|
||||||
struct internal_reloc n;
|
struct internal_reloc n;
|
||||||
|
@ -3420,7 +3420,7 @@ coff_write_object_contents (abfd)
|
||||||
{
|
{
|
||||||
#ifdef COFF_WITH_PE
|
#ifdef COFF_WITH_PE
|
||||||
/* we store the actual reloc count in the first reloc's addr */
|
/* 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 ++;
|
reloc_count ++;
|
||||||
#endif
|
#endif
|
||||||
reloc_count += current->reloc_count;
|
reloc_count += current->reloc_count;
|
||||||
|
@ -3451,7 +3451,7 @@ coff_write_object_contents (abfd)
|
||||||
reloc_base += current->reloc_count * bfd_coff_relsz (abfd);
|
reloc_base += current->reloc_count * bfd_coff_relsz (abfd);
|
||||||
#ifdef COFF_WITH_PE
|
#ifdef COFF_WITH_PE
|
||||||
/* extra reloc to hold real count */
|
/* 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);
|
reloc_base += bfd_coff_relsz (abfd);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -757,6 +757,10 @@ _bfd_coff_final_link (abfd, info)
|
||||||
o->flags |= SEC_RELOC;
|
o->flags |= SEC_RELOC;
|
||||||
o->rel_filepos = rel_filepos;
|
o->rel_filepos = rel_filepos;
|
||||||
rel_filepos += o->reloc_count * relsz;
|
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)
|
if (bfd_coff_long_section_names (abfd)
|
||||||
|
|
Loading…
Reference in New Issue