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 08:21:03PM -0400, Daniel Jacobowitz wrote:
> On Fri, Aug 03, 2007 at 09:43:00AM +0930, Alan Modra wrote:
> > 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.
> 
> Yes, I agree.  But keep in mind that this patch on its own is going to
> lay waste to GDB's core debugging :-)  It will now disassemble all
> functions as zeroes.
> 
> What we really want in GDB is now a bit complicated:
>   - Prefer data from core file if within p_filesz.
>   - Prefer data from executable if between p_filesz and p_memsz.
>   - Show zeroes (rather than read errors) for data between p_filesz
>     and p_memsz if not present in the executable.
> 
> Messy...

I'd be happy with the following.  Please check that this doesn't break
gdb..

	* elf.c (_bfd_elf_make_section_from_phdr): Properly handle
	bss segments.

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	3 Aug 2007 02:44:28 -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,13 @@ _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);
+      bfd_vma align;
+
+      sprintf (namebuf, "%s%d%s", typename, index, split ? "b" : "");
       len = strlen (namebuf) + 1;
       name = bfd_alloc (abfd, len);
       if (!name)
@@ -2287,8 +2293,21 @@ _bfd_elf_make_section_from_phdr (bfd *ab
       newsect->vma = hdr->p_vaddr + hdr->p_filesz;
       newsect->lma = hdr->p_paddr + hdr->p_filesz;
       newsect->size = hdr->p_memsz - hdr->p_filesz;
+      newsect->filepos = hdr->p_offset + hdr->p_filesz;
+      align = newsect->vma & -newsect->vma;
+      if (align == 0 || align > hdr->p_align)
+	align = hdr->p_align;
+      newsect->alignment_power = bfd_log2 (align);
       if (hdr->p_type == PT_LOAD)
 	{
+	  /* Hack for gdb.  Segments that have not been modified do
+	     not have their contents written to a core file, on the
+	     assumption that a debugger can find the contents in the
+	     executable.  We flag this case by setting the fake
+	     section size to zero.  Note that "real" bss sections will
+	     always have their contents dumped to the core file.  */
+	  if (bfd_get_format (abfd) == bfd_core)
+	    newsect->size = 0;
 	  newsect->flags |= SEC_ALLOC;
 	  if (hdr->p_flags & PF_X)
 	    newsect->flags |= SEC_CODE;

-- 
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]