From: "H. J. Lu" <hjl@lucon.org>
To: binutils@sources.redhat.com
Cc: richard@codesourcery.com
Subject: Re: PATCH: PR ld/2655/2657: Incorrrect padding for .eh_frame section
Date: Mon, 15 May 2006 03:19:00 -0000 [thread overview]
Message-ID: <20060513174131.GB7805@lucon.org> (raw)
In-Reply-To: <20060513005246.GA1310@lucon.org>
[-- Attachment #1: Type: text/plain, Size: 1378 bytes --]
On Fri, May 12, 2006 at 05:52:46PM -0700, H. J. Lu wrote:
> 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.
>
>
We shouldn't pad the .eh_frame section to its section alignment. We
only need to make sure that CIE/FDE records are aligned at pointer
size. Otherwise, we may generate bad .eh_frame section if the input
section alignment isn't pointer size. I am enclosing a new patch. I
also added a new testcase.
H.J.
[-- Attachment #2: bfd-eh-4.patch --]
[-- Type: text/plain, Size: 2394 bytes --]
2006-05-13 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. Don't pad to the section alignment.
--- bfd/elf-eh-frame.c.eh 2006-05-02 06:49:58.000000000 -0700
+++ bfd/elf-eh-frame.c 2006-05-13 10:33:37.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)
{
@@ -1262,40 +1262,13 @@ _bfd_elf_write_section_eh_frame (bfd *ab
}
}
- {
- unsigned int alignment = 1 << sec->alignment_power;
- unsigned int pad = sec->size % alignment;
-
- /* Don't pad beyond the raw size of the output section. It
- can happen at the last input section. */
- if (pad
- && ((sec->output_offset + sec->size + pad)
- <= sec->output_section->size))
- {
- bfd_byte *buf;
- unsigned int new_size;
-
- /* Find the last CIE/FDE. */
- ent = sec_info->entry + sec_info->count;
- while (--ent != sec_info->entry)
- if (!ent->removed)
- break;
-
- /* The size of the last CIE/FDE must be at least 4. */
- if (ent->removed || ent->size < 4)
- abort ();
-
- pad = alignment - pad;
- buf = contents + ent->new_offset - sec->output_offset;
- new_size = size_of_output_cie_fde (ent, ptr_size);
-
- /* Pad it with DW_CFA_nop */
- memset (buf + new_size, 0, pad);
- bfd_put_32 (abfd, new_size + pad - 4, buf);
-
- sec->size += pad;
- }
- }
+ /* We don't align the section to its section alignment since the
+ runtime library only expects all CIE/FDE records aligned at
+ 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)
+ abort ();
return bfd_set_section_contents (abfd, sec->output_section,
contents, (file_ptr) sec->output_offset,
[-- Attachment #3: ld-test-eh-2.patch --]
[-- Type: text/plain, Size: 5128 bytes --]
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-elf/eh3.d: Likewise.
* ld-elf/eh3.s: Likewise.
* ld-elf/eh3a.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
--- ld/testsuite/ld-elf/eh3.d.eh 2006-05-13 10:24:59.000000000 -0700
+++ ld/testsuite/ld-elf/eh3.d 2006-05-13 10:27:12.000000000 -0700
@@ -0,0 +1,33 @@
+#source: eh3.s
+#source: eh3a.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
+#pass
--- ld/testsuite/ld-elf/eh3.s.eh 2006-05-13 10:24:44.000000000 -0700
+++ ld/testsuite/ld-elf/eh3.s 2006-05-13 10:24:24.000000000 -0700
@@ -0,0 +1,48 @@
+ .text
+.globl _start
+ .type _start, %function
+_start:
+.LFB2:
+.LCFI0:
+.LCFI1:
+.LFE2:
+ .size _start, .-_start
+ .section .eh_frame,"a",%progbits
+ .align 16
+.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/eh3a.s.eh 2006-05-13 10:24:41.000000000 -0700
+++ ld/testsuite/ld-elf/eh3a.s 2006-05-13 10:24:30.000000000 -0700
@@ -0,0 +1,3 @@
+ .section .eh_frame,"a",%progbits
+ .align 8
+ .zero 8
next prev parent reply other threads:[~2006-05-13 17:42 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-05-13 1:07 Incorrect assumption on the CIE/FDE alignment H. J. Lu
2006-05-13 17:42 ` PATCH: PR ld/2655/2657: Incorrrect padding for .eh_frame section H. J. Lu
2006-05-15 2:03 ` H. J. Lu
2006-05-15 3:19 ` H. J. Lu [this message]
2006-05-24 12:16 ` Alan Modra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060513174131.GB7805@lucon.org \
--to=hjl@lucon.org \
--cc=binutils@sources.redhat.com \
--cc=richard@codesourcery.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).