This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [patch] bfd: Core files with p_filesz < p_memsz (build-id)
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: Jan Kratochvil <jan dot kratochvil at redhat dot com>, Roland McGrath <roland at redhat dot com>, binutils at sources dot redhat dot com
- Date: Fri, 3 Aug 2007 09:43:00 +0930
- Subject: Re: [patch] bfd: Core files with p_filesz < p_memsz (build-id)
- References: <20070728191354.GA14892@host0.dyn.jankratochvil.net> <20070728201604.AEBDB4D058D@magilla.localdomain> <20070729165314.GA8906@host0.dyn.jankratochvil.net> <20070801130547.GN23966@bubble.grove.modra.org> <20070802200249.GA7696@caradoc.them.org>
On Thu, Aug 02, 2007 at 04:02:49PM -0400, Daniel Jacobowitz wrote:
> On Wed, Aug 01, 2007 at 10:35:47PM +0930, Alan Modra wrote:
> > I think BFD is still doing the right thing. Please fix this in gdb.
>
> Could you elaborate? Consider a core with these headers:
[snip]
> So we report the BSS portion of an entirely BSS PT_LOAD as having size
> zero (plus contents flag, bizarre). But the BSS portion of a partially
> filled PT_LOAD is shown with size equal to its memory size. I don't
> see why they should be inconsistent, and it makes handling this in GDB
> a little awkward.
Oh, I see. I was just looking at the split case. I'd say the
non-split behaviour is a bug. A program header with p_filesz zero and
p_memsz non-zero really ought to create a bfd section with size equal
to p_memsz, without SEC_HAS_CONTENTS and SEC_LOAD.
So I think we should apply the following, and possibly on top of this
do something special for core files.
Index: bfd/elf.c
===================================================================
RCS file: /cvs/src/src/bfd/elf.c,v
retrieving revision 1.404
diff -u -p -w -r1.404 elf.c
--- bfd/elf.c 1 Aug 2007 19:55:10 -0000 1.404
+++ bfd/elf.c 2 Aug 2007 23:58:56 -0000
@@ -2223,7 +2223,7 @@ _bfd_elf_new_section_hook (bfd *abfd, as
for the single program segment. The first has the length specified by
the file size of the segment, and the second has the length specified
by the difference between the two sizes. In effect, the segment is split
- into it's initialized and uninitialized parts.
+ into its initialized and uninitialized parts.
*/
@@ -2242,6 +2242,9 @@ _bfd_elf_make_section_from_phdr (bfd *ab
split = ((hdr->p_memsz > 0)
&& (hdr->p_filesz > 0)
&& (hdr->p_memsz > hdr->p_filesz));
+
+ if (hdr->p_filesz > 0)
+ {
sprintf (namebuf, "%s%d%s", typename, index, split ? "a" : "");
len = strlen (namebuf) + 1;
name = bfd_alloc (abfd, len);
@@ -2272,10 +2275,11 @@ _bfd_elf_make_section_from_phdr (bfd *ab
{
newsect->flags |= SEC_READONLY;
}
+ }
- if (split)
+ if (hdr->p_memsz > hdr->p_filesz)
{
- sprintf (namebuf, "%s%db", typename, index);
+ sprintf (namebuf, "%s%d%s", typename, index, split ? "b" : "");
len = strlen (namebuf) + 1;
name = bfd_alloc (abfd, len);
if (!name)
--
Alan Modra
Australia Development Lab, IBM