From: "H.J. Lu" <hjl@lucon.org>
To: binutils@sources.redhat.com
Subject: Re: PATCH: PR binutils/5488: strip doesn't handle PT_NOTE segment properly
Date: Thu, 20 Dec 2007 15:54:00 -0000 [thread overview]
Message-ID: <20071220155403.GA31192@lucon.org> (raw)
In-Reply-To: <20071220150933.GA11560@lucon.org>
On Thu, Dec 20, 2007 at 07:09:33AM -0800, H.J. Lu wrote:
> rewrite_elf_program_header don't consider PT_NOTE segment at all.
> This patch fixes it.
>
>
Here is the patch with a testcase.
H.J.
----
bfd/
2007-12-20 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/5488
* elf.c (IS_NOTE): New.
(IS_COREFILE_NOTE): Use IS_NOTE.
(IS_SECTION_IN_INPUT_SEGMENT): Use IS_NOTE instead of
IS_COREFILE_NOTE.
ld/testsuite/
2007-12-20 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/5488
* ld-elf/note-2.d: New.
* ld-elf/note-2.s: Likewise.
* ld-elf/note-2.t: Likewise.
--- binutils/bfd/elf.c.note 2007-12-20 05:57:09.000000000 -0800
+++ binutils/bfd/elf.c 2007-12-20 07:50:51.000000000 -0800
@@ -5193,15 +5193,22 @@ rewrite_elf_program_header (bfd *ibfd, b
&& (section->lma + SECTION_SIZE (section, segment) \
<= SEGMENT_END (segment, base)))
- /* Special case: corefile "NOTE" section containing regs, prpsinfo etc. */
-#define IS_COREFILE_NOTE(p, s) \
+ /* Handle PT_NOTE segment. */
+#define IS_NOTE(p, s) \
(p->p_type == PT_NOTE \
- && bfd_get_format (ibfd) == bfd_core \
- && s->vma == 0 && s->lma == 0 \
+ && elf_section_type (s) == SHT_NOTE \
&& (bfd_vma) s->filepos >= p->p_offset \
&& ((bfd_vma) s->filepos + s->size \
<= p->p_offset + p->p_filesz))
+ /* Special case: corefile "NOTE" section containing regs, prpsinfo
+ etc. */
+#define IS_COREFILE_NOTE(p, s) \
+ (IS_NOTE (p, s) \
+ && bfd_get_format (ibfd) == bfd_core \
+ && s->vma == 0 \
+ && s->lma == 0)
+
/* The complicated case when p_vaddr is 0 is to handle the Solaris
linker, which generates a PT_INTERP section with p_vaddr and
p_memsz set to 0. */
@@ -5220,7 +5227,8 @@ rewrite_elf_program_header (bfd *ibfd, b
A section will be included if:
1. It is within the address space of the segment -- we use the LMA
if that is set for the segment and the VMA otherwise,
- 2. It is an allocated segment,
+ 2. It is an allocated section or a NOTE section in a PT_NOTE
+ segment.
3. There is an output section associated with it,
4. The section has not already been allocated to a previous segment.
5. PT_GNU_STACK segments do not include any sections.
@@ -5233,7 +5241,7 @@ rewrite_elf_program_header (bfd *ibfd, b
? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr) \
: IS_CONTAINED_BY_VMA (section, segment)) \
&& (section->flags & SEC_ALLOC) != 0) \
- || IS_COREFILE_NOTE (segment, section)) \
+ || IS_NOTE (segment, section)) \
&& segment->p_type != PT_GNU_STACK \
&& (segment->p_type != PT_TLS \
|| (section->flags & SEC_THREAD_LOCAL)) \
@@ -5767,6 +5775,7 @@ rewrite_elf_program_header (bfd *ibfd, b
#undef SECTION_SIZE
#undef IS_CONTAINED_BY_VMA
#undef IS_CONTAINED_BY_LMA
+#undef IS_NOTE
#undef IS_COREFILE_NOTE
#undef IS_SOLARIS_PT_INTERP
#undef IS_SECTION_IN_INPUT_SEGMENT
--- binutils/ld/testsuite/ld-elf/note-2.d.note 2007-12-20 07:42:48.000000000 -0800
+++ binutils/ld/testsuite/ld-elf/note-2.d 2007-12-20 07:49:47.000000000 -0800
@@ -0,0 +1,15 @@
+#ld: -Tnote-2.t
+#objcopy_linked_file: -R .foo
+#readelf: -l --wide
+
+#...
+Program Headers:
+ Type.*
+ LOAD +0x[0-9a-f]+ .*
+ NOTE +0x[0-9a-f]+ .*
+
+#...
+ Segment Sections...
+ 00[ \t]+.text *
+ 01[ \t]+.note *
+#pass
--- binutils/ld/testsuite/ld-elf/note-2.s.note 2007-12-20 07:42:51.000000000 -0800
+++ binutils/ld/testsuite/ld-elf/note-2.s 2007-12-16 09:51:55.000000000 -0800
@@ -0,0 +1,8 @@
+ .globl _entry
+ .text
+_entry:
+ .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .section .foo,"awx",%progbits
+ .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .section .note,"",%note
+ .byte 0
--- binutils/ld/testsuite/ld-elf/note-2.t.note 2007-12-20 07:42:53.000000000 -0800
+++ binutils/ld/testsuite/ld-elf/note-2.t 2007-12-20 07:48:54.000000000 -0800
@@ -0,0 +1,13 @@
+ENTRY(_entry)
+PHDRS
+{
+ data PT_LOAD;
+ note PT_NOTE;
+}
+SECTIONS
+{
+ .text : { *(.text) } :data
+ .foo : { *(.foo) } :data
+ .note : { *(.note) } :note
+ /DISCARD/ : { *(*) }
+}
next prev parent reply other threads:[~2007-12-20 15:54 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-20 15:09 H.J. Lu
2007-12-20 15:54 ` H.J. Lu [this message]
2007-12-24 16:52 ` Nick Clifton
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=20071220155403.GA31192@lucon.org \
--to=hjl@lucon.org \
--cc=binutils@sources.redhat.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).