PATCH: PR ld/2655/2657: Incorrrect padding for .eh_frame section

H. J. Lu hjl@lucon.org
Mon May 15 02:03:00 GMT 2006


On Fri, May 12, 2006 at 01:54:13PM -0700, H. J. Lu wrote:
> On Fri, May 12, 2006 at 10:05:12AM -0700, H. J. Lu wrote:
> > Hi Richard,
> > 
> > Your patch:
> > 
> > http://sourceware.org/ml/binutils/2004-11/msg00226.html
> > 
> > assumes that CIE/FDE are aligned at the pointer size. But it isn't
> > necessarily true. See
> > 
> > http://sources.redhat.com/bugzilla/show_bug.cgi?id=2657
> > 
> 
> This patch fixes 2 PRs 2655/2657. PR 2655 is a gcc bug
> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27576
> 
> PR 2657 is we don't properly shrink CIE/FDE.
> 

It turns out that _bfd_elf_discard_section_eh_frame will always pad
CIE/FDE record to the pointer size boundary since it calls
size_of_output_cie_fde to set the CIE/FDE record size. Even if the next
.eh_frame section is marked for 4 byte alignment, it always will be
aligned at the pointer size. Fixing PR 2657 will also fix PR 2655.
I am enclosing an upated patch and 2 testcases for x86-64.


H.J.
-------------- next part --------------
2006-05-12  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/2655
	PR ld/2657
	* elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Properly
	update CIE/FDE length.

--- bfd/elf-eh-frame.c.eh	2006-05-02 06:49:58.000000000 -0700
+++ bfd/elf-eh-frame.c	2006-05-12 17:19:33.000000000 -0700
@@ -1075,12 +1075,12 @@ _bfd_elf_write_section_eh_frame (bfd *ab
       end = buf + ent->size;
       new_size = size_of_output_cie_fde (ent, ptr_size);
 
-      /* Install the new size, filling the extra bytes with DW_CFA_nops.  */
+      /* Update the size.  It may be shrinked.  */
+      bfd_put_32 (abfd, new_size - 4, buf);
+
+      /* Filling the extra bytes with DW_CFA_nops.  */
       if (new_size != ent->size)
-	{
-	  memset (end, 0, new_size - ent->size);
-	  bfd_put_32 (abfd, new_size - 4, buf);
-	}
+	memset (end, 0, new_size - ent->size);
 
       if (ent->cie)
 	{
-------------- next part --------------
2006-05-12  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/2655
	PR ld/2657
	* ld-elf/eh1.d: New file.
	* ld-elf/eh1.s: Likewise.
	* ld-elf/eh1a.s: Likewise.
	* ld-elf/eh2.d: Likewise.
	* ld-elf/eh2a.s: Likewise.

--- ld/testsuite/ld-elf/eh1.d.eh	2006-05-12 17:43:02.000000000 -0700
+++ ld/testsuite/ld-elf/eh1.d	2006-05-12 17:15:23.000000000 -0700
@@ -0,0 +1,33 @@
+#source: eh1.s
+#source: eh1a.s
+#ld:
+#readelf: -wf
+#target: x86_64-*-*
+
+The section .eh_frame contains:
+
+00000000 00000014 00000000 CIE
+  Version:               1
+  Augmentation:          ""
+  Code alignment factor: 1
+  Data alignment factor: -8
+  Return address column: 16
+
+  DW_CFA_def_cfa: r7 ofs 8
+  DW_CFA_offset: r16 at cfa-8
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+
+00000018 0000001c 0000001c FDE cie=00000000 pc=004000b0..004000b0
+  DW_CFA_advance_loc: 0 to 004000b0
+  DW_CFA_def_cfa_offset: 16
+  DW_CFA_offset: r6 at cfa-16
+  DW_CFA_advance_loc: 0 to 004000b0
+  DW_CFA_def_cfa_reg: r6
+
+00000038 ZERO terminator
+
--- ld/testsuite/ld-elf/eh1.s.eh	2006-05-12 17:43:02.000000000 -0700
+++ ld/testsuite/ld-elf/eh1.s	2006-05-12 17:15:46.000000000 -0700
@@ -0,0 +1,47 @@
+	.text
+.globl _start
+	.type	_start, %function
+_start:
+.LFB2:
+.LCFI0:
+.LCFI1:
+.LFE2:
+	.size	_start, .-_start
+	.section	.eh_frame,"a",%progbits
+.Lframe1:
+	.long	.LECIE1-.LSCIE1
+.LSCIE1:
+	.long	0x0
+	.byte	0x1
+	.string	""
+	.uleb128 0x1
+	.sleb128 -8
+	.byte	0x10
+	.byte	0xc
+	.uleb128 0x7
+	.uleb128 0x8
+	.byte	0x90
+	.uleb128 0x1
+	.align 8
+.LECIE1:
+.LSFDE1:
+	.long	.LEFDE1-.LASFDE1
+.LASFDE1:
+	.long	.LASFDE1-.Lframe1
+	.quad	.LFB2
+	.quad	.LFE2-.LFB2
+	.byte	0x4
+	.long	.LCFI0-.LFB2
+	.byte	0xe
+	.uleb128 0x10
+	.byte	0x86
+	.uleb128 0x2
+	.byte	0x4
+	.long	.LCFI1-.LCFI0
+	.byte	0xd
+	.uleb128 0x6
+	.byte 0x0
+	.byte 0x0
+	.byte 0x0
+	.byte 0x0
+.LEFDE1:
--- ld/testsuite/ld-elf/eh1a.s.eh	2006-05-12 17:43:02.000000000 -0700
+++ ld/testsuite/ld-elf/eh1a.s	2006-05-12 17:17:36.000000000 -0700
@@ -0,0 +1,3 @@
+	.section	.eh_frame,"a",%progbits
+	.align	8
+	.zero	4
--- ld/testsuite/ld-elf/eh2.d.eh	2006-05-12 17:43:02.000000000 -0700
+++ ld/testsuite/ld-elf/eh2.d	2006-05-12 17:18:35.000000000 -0700
@@ -0,0 +1,33 @@
+#source: eh1.s
+#source: eh2a.s
+#ld:
+#readelf: -wf
+#target: x86_64-*-*
+
+The section .eh_frame contains:
+
+00000000 00000014 00000000 CIE
+  Version:               1
+  Augmentation:          ""
+  Code alignment factor: 1
+  Data alignment factor: -8
+  Return address column: 16
+
+  DW_CFA_def_cfa: r7 ofs 8
+  DW_CFA_offset: r16 at cfa-8
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+
+00000018 0000001c 0000001c FDE cie=00000000 pc=004000b0..004000b0
+  DW_CFA_advance_loc: 0 to 004000b0
+  DW_CFA_def_cfa_offset: 16
+  DW_CFA_offset: r6 at cfa-16
+  DW_CFA_advance_loc: 0 to 004000b0
+  DW_CFA_def_cfa_reg: r6
+
+00000038 ZERO terminator
+
--- ld/testsuite/ld-elf/eh2a.s.eh	2006-05-12 17:43:02.000000000 -0700
+++ ld/testsuite/ld-elf/eh2a.s	2006-05-12 17:17:42.000000000 -0700
@@ -0,0 +1,3 @@
+	.section	.eh_frame,"a",%progbits
+	.align	4
+	.zero	4


More information about the Binutils mailing list