mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-12 01:24:12 +08:00
* 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.
This commit is contained in:
@ -1,3 +1,14 @@
|
|||||||
|
2003-10-07 Nathan Sidwell <nathan@codesourcery.com>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2003-10-06 H.J. Lu <hongjiu.lu@intel.com>
|
2003-10-06 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Pad the
|
* elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Pad the
|
||||||
|
@ -1694,15 +1694,21 @@ coff_set_alignment_hook (abfd, section, scnhdr)
|
|||||||
struct external_reloc dst;
|
struct external_reloc dst;
|
||||||
struct internal_reloc n;
|
struct internal_reloc n;
|
||||||
file_ptr oldpos = bfd_tell (abfd);
|
file_ptr oldpos = bfd_tell (abfd);
|
||||||
|
bfd_size_type relsz = bfd_coff_relsz (abfd);
|
||||||
|
|
||||||
bfd_seek (abfd, (file_ptr) hdr->s_relptr, 0);
|
bfd_seek (abfd, (file_ptr) hdr->s_relptr, 0);
|
||||||
if (bfd_bread ((PTR) &dst, (bfd_size_type) bfd_coff_relsz (abfd), abfd)
|
if (bfd_bread ((PTR) &dst, relsz, abfd) != relsz)
|
||||||
!= bfd_coff_relsz (abfd))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
coff_swap_reloc_in (abfd, &dst, &n);
|
coff_swap_reloc_in (abfd, &dst, &n);
|
||||||
bfd_seek (abfd, oldpos, 0);
|
bfd_seek (abfd, oldpos, 0);
|
||||||
section->reloc_count = hdr->s_nreloc = n.r_vaddr;
|
section->reloc_count = hdr->s_nreloc = n.r_vaddr - 1;
|
||||||
|
section->rel_filepos += relsz;
|
||||||
}
|
}
|
||||||
|
else if (hdr->s_nreloc == 0xffff)
|
||||||
|
(*_bfd_error_handler)
|
||||||
|
("%s: warning: claims to have 0xffff relocs, without overflow",
|
||||||
|
bfd_get_filename (abfd));
|
||||||
}
|
}
|
||||||
#undef ALIGN_SET
|
#undef ALIGN_SET
|
||||||
#undef ELIFALIGN_SET
|
#undef ELIFALIGN_SET
|
||||||
|
@ -1028,10 +1028,27 @@ _bfd_coff_final_link (bfd *abfd,
|
|||||||
bfd_coff_swap_reloc_out (abfd, irel, erel);
|
bfd_coff_swap_reloc_out (abfd, irel, erel);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
|
if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0)
|
||||||
|| (bfd_bwrite (external_relocs,
|
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, abfd)
|
||||||
!= (bfd_size_type) relsz * o->reloc_count))
|
!= (bfd_size_type) relsz * o->reloc_count)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -990,7 +990,11 @@ _bfd_XXi_swap_scnhdr_out (abfd, in, out)
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scnhdr_int->s_nreloc <= 0xffff)
|
/* Although we could encode 0xffff relocs here, we do not, to be
|
||||||
|
consistent with other parts of bfd. Also it lets us warn, as
|
||||||
|
we should never see 0xffff here w/o having the overflow flag
|
||||||
|
set. */
|
||||||
|
if (scnhdr_int->s_nreloc < 0xffff)
|
||||||
H_PUT_16 (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc);
|
H_PUT_16 (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user