ld -r abort in _bfd_elf_write_section_eh_frame
Turning on .eh_frame processing for ld -r resulted in systemtap tickling a ld bug. Triggered by the zero terminator not being added to .eh_frame in a separate file as it usually is (crtend.o), but instead being present in the last .eh_frame section along with CIEs and FDEs. The 4-byte terminator makes the section size check fail on 64-bit targets. * elf-eh-frame (_bfd_elf_write_section_eh_frame): Adjust section size check to account for possible zero terminator.
This commit is contained in:
parent
26a8485972
commit
4de1599bcf
@ -1,3 +1,8 @@
|
||||
2014-11-11 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Adjust section
|
||||
size check to account for possible zero terminator.
|
||||
|
||||
2014-11-10 James Cowgill <James.Cowgill@imgtec.com>
|
||||
|
||||
* elfxx-mips.c (_bfd_mips_elf_section_processing): don't force small
|
||||
|
@ -1398,6 +1398,7 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
|
||||
struct eh_frame_hdr_info *hdr_info;
|
||||
unsigned int ptr_size;
|
||||
struct eh_cie_fde *ent;
|
||||
bfd_size_type sec_size;
|
||||
|
||||
if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
|
||||
/* FIXME: octets_per_byte. */
|
||||
@ -1723,7 +1724,11 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
|
||||
the pointer size. _bfd_elf_discard_section_eh_frame should
|
||||
have padded CIE/FDE records to multiple of pointer size with
|
||||
size_of_output_cie_fde. */
|
||||
if ((sec->size % ptr_size) != 0)
|
||||
sec_size = sec->size;
|
||||
if (sec_info->count != 0
|
||||
&& sec_info->entry[sec_info->count - 1].size == 4)
|
||||
sec_size -= 4;
|
||||
if ((sec_size % ptr_size) != 0)
|
||||
abort ();
|
||||
|
||||
/* FIXME: octets_per_byte. */
|
||||
|
Loading…
Reference in New Issue
Block a user