This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] bfd: Core files with p_filesz < p_memsz (build-id)


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]