summaryrefslogtreecommitdiff
path: root/bfd/elf-eh-frame.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl@lucon.org>2003-10-06 18:10:48 +0000
committerH.J. Lu <hjl@lucon.org>2003-10-06 18:10:48 +0000
commit456e191296ffdff8095391e423ad40fb122c9f8f (patch)
treedebf1b36deae2e8588a70877e1cc72636dbd91e6 /bfd/elf-eh-frame.c
parentb7fa4fbb8b6893a55fca3d3a79290140a8c17023 (diff)
downloadgdb-456e191296ffdff8095391e423ad40fb122c9f8f.tar.gz
2003-10-06 H.J. Lu <hongjiu.lu@intel.com>
* elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Pad the last CIE/FDE if needed.
Diffstat (limited to 'bfd/elf-eh-frame.c')
-rw-r--r--bfd/elf-eh-frame.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
index c71129e694f..c2f6b961a13 100644
--- a/bfd/elf-eh-frame.c
+++ b/bfd/elf-eh-frame.c
@@ -1026,6 +1026,38 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
and 3xDW_CFA_nop as pad */
p += 16;
}
+ else
+ {
+ unsigned int alignment = 1 << sec->alignment_power;
+ unsigned int pad = sec->_cooked_size % alignment;
+
+ if (pad)
+ {
+ /* Find the last CIE/FDE. */
+ for (i = sec_info->count - 1; i > 0; i--)
+ if (! sec_info->entry[i].removed)
+ break;
+
+ /* The size of the last CIE/FDE must be at least 4. */
+ if (sec_info->entry[i].removed
+ || sec_info->entry[i].size < 4)
+ abort ();
+
+ pad = alignment - pad;
+
+ buf = contents + sec_info->entry[i].new_offset;
+
+ /* Update length. */
+ sec_info->entry[i].size += pad;
+ bfd_put_32 (abfd, sec_info->entry[i].size - 4, buf);
+
+ /* Pad it with DW_CFA_nop */
+ memset (p, 0, pad);
+ p += pad;
+
+ sec->_cooked_size += pad;
+ }
+ }
BFD_ASSERT ((bfd_size_type) (p - contents) == sec->_cooked_size);