forked from Imagelibrary/binutils-gdb
[PATCH v2 2/2] coff-go32: support extended relocations
This patch extends the relocation and line number counters for coff-go32 and coff-go32-exe to 32 bits. As I understand it works the same as for PE-COFF: If the number of relocations in an object file exceeds 65534, the NRELOC field is set to 65535 and the actual number of relocations is stored in the VADDR field of the first relocation entry. Executable files have no relocations, and thus the NRELOC field is repurposed to extend NLNNO to 32-bits. bfd * coff-go32.c (COFF_GO32, IMAGE_SCN_LNK_NRELOC_OVFL) (coff_SWAP_scnhdr_in, coff_SWAP_scnhdr_out): Define. (_bfd_go32_swap_scnhdr_in, _bfd_go32_swap_scnhdr_out) (_bfd_go32_mkobject): New functions. * coff-stgo32.c (IMAGE_SCN_LNK_NRELOC_OVFL) (coff_SWAP_scnhdr_in, coff_SWAP_scnhdr_out): Define. (go32exe_mkobject): Call _bfd_go32_mkobject. * coffcode.h (COFF_WITH_EXTENDED_RELOC_COUNTER): Define. (coff_set_alignment_hook): Define function for COFF_GO32_EXE and COFF_GO32. (coff_write_relocs): Enable extended reloc counter code if COFF_WITH_EXTENDED_RELOC_COUNTER is defined. Test for obj_go32. (coff_write_object_contents): Likewise. Pad section headers for COFF_GO32 and COFF_GO32EXE. Use bfd_coff_swap_scnhdr_out instead of coff_swap_scnhdr_out. * cofflink.c (_bfd_coff_final_link): Test also for obj_go32 to enable extended reloc counter. * coffswap.h: (coff_swap_scnhdr_in, coff_swap_scnhdr_out): Declare with ATTRIBUTE_UNUSED. * libcoff-in.h: (struct coff_tdata): New field go32. (obj_go32): Define. * libcoff.h: Regenerate.
This commit is contained in:
committed by
Nick Clifton
parent
06ca5dd49a
commit
f717994fe8
@@ -689,7 +689,7 @@ _bfd_coff_final_link (bfd *abfd,
|
||||
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)
|
||||
if ((obj_pe (abfd) || obj_go32 (abfd)) && o->reloc_count >= 0xffff)
|
||||
rel_filepos += relsz;
|
||||
}
|
||||
|
||||
@@ -1108,7 +1108,7 @@ _bfd_coff_final_link (bfd *abfd,
|
||||
|
||||
if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0)
|
||||
goto error_return;
|
||||
if (obj_pe (abfd) && o->reloc_count >= 0xffff)
|
||||
if ((obj_pe (abfd) || obj_go32 (abfd)) && o->reloc_count >= 0xffff)
|
||||
{
|
||||
/* In PE COFF, write the count of relocs as the first
|
||||
reloc. The header overflow bit will be set
|
||||
|
||||
Reference in New Issue
Block a user