Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "H. J. Lu" <hjl@lucon.org>
To: GDB <gdb-patches@sources.redhat.com>
Subject: PATCH: Set SEC_NEVER_LOAD when clearing SEC_LOAD for gcore
Date: Wed, 20 Jun 2007 18:23:00 -0000	[thread overview]
Message-ID: <20070620182308.GA7859@lucon.org> (raw)

http://sources.redhat.com/bugzilla/show_bug.cgi?id=4606

is a gdb bug. When gcore_create_callback clears SEC_LOAD, it does't
set SEC_NEVER_LOAD nor clear SEC_HAS_CONTENTS. elf_fake_sections has

  if (this_hdr->sh_type == SHT_NULL)
    {    
      if ((asect->flags & SEC_GROUP) != 0)
        this_hdr->sh_type = SHT_GROUP;
      else if ((asect->flags & SEC_ALLOC) != 0 
               && (((asect->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) ==
0)
                   || (asect->flags & SEC_NEVER_LOAD) != 0))
        this_hdr->sh_type = SHT_NOBITS;
      else
        this_hdr->sh_type = SHT_PROGBITS;
    }

As the result, this_hdr->sh_type is set to SHT_PROGBITS while
SEC_LOAD is cleared. When Alan made this change:

-                 if ((flags & SEC_LOAD) != 0)
+                 if (this_hdr->sh_type != SHT_NOBITS)

in assign_file_positions_for_load_sections, gcore no longer works
correctly.

This patch sets SEC_NEVER_LOAD when clearing SEC_LOAD. It restores
the old behavior and reduces the size of core file significantly.
I tested it on both Linux/x86-64 and Linux/ia64.  On Linux/ia64,
I got

-rw-r--r--  1 hjl hjl  349400 Jun 20 10:54 core.new
-rw-r--r--  1 hjl hjl 3003608 Jun 19 17:28 core.old

On Linux/x86-64, I got

-rw-r--r--  1 hjl hjl  195848 Jun 20 11:10 core.new
-rw-r--r--  1 hjl hjl 1531144 Jun 20 11:21 core.old

BTW, bfd_make_section_anyway_with_flags is preferred over
bfd_make_section_anyway and bfd_set_section_flags.


H.J.
---
2007-06-20  H.J. Lu  <hongjiu.lu@intel.com>

	PR 4606
	* gcore.c (gcore_command): Use bfd_make_section_anyway_with_flags
	instead of bfd_make_section_anyway.
	(gcore_create_callback): Likewise.  Also set SEC_NEVER_LOAD
	when clearing SEC_LOAD.

--- gdb/gcore.c.gcore	2007-06-19 08:44:04.000000000 -0700
+++ gdb/gcore.c	2007-06-20 11:09:43.000000000 -0700
@@ -88,14 +88,15 @@ gcore_command (char *args, int from_tty)
   /* Create the note section.  */
   if (note_data != NULL && note_size != 0)
     {
-      note_sec = bfd_make_section_anyway (obfd, "note0");
+      note_sec = bfd_make_section_anyway_with_flags (obfd, "note0",
+						     SEC_HAS_CONTENTS
+						     | SEC_READONLY
+						     | SEC_ALLOC);
       if (note_sec == NULL)
 	error (_("Failed to create 'note' section for corefile: %s"),
 	       bfd_errmsg (bfd_get_error ()));
 
       bfd_set_section_vma (obfd, note_sec, 0);
-      bfd_set_section_flags (obfd, note_sec,
-			     SEC_HAS_CONTENTS | SEC_READONLY | SEC_ALLOC);
       bfd_set_section_alignment (obfd, note_sec, 0);
       bfd_set_section_size (obfd, note_sec, note_size);
     }
@@ -359,6 +360,7 @@ gcore_create_callback (CORE_ADDR vaddr, 
 	      && !(bfd_get_file_flags (abfd) & BFD_IN_MEMORY))
 	    {
 	      flags &= ~SEC_LOAD;
+	      flags |= SEC_NEVER_LOAD;
 	      goto keep;	/* break out of two nested for loops */
 	    }
 	}
@@ -372,7 +374,7 @@ gcore_create_callback (CORE_ADDR vaddr, 
   else
     flags |= SEC_DATA;
 
-  osec = bfd_make_section_anyway (obfd, "load");
+  osec = bfd_make_section_anyway_with_flags (obfd, "load", flags);
   if (osec == NULL)
     {
       warning (_("Couldn't make gcore segment: %s"),
@@ -389,7 +391,6 @@ gcore_create_callback (CORE_ADDR vaddr, 
   bfd_set_section_size (obfd, osec, size);
   bfd_set_section_vma (obfd, osec, vaddr);
   bfd_section_lma (obfd, osec) = 0; /* ??? bfd_set_section_lma?  */
-  bfd_set_section_flags (obfd, osec, flags);
   return 0;
 }
 


             reply	other threads:[~2007-06-20 18:23 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-06-20 18:23 H. J. Lu [this message]
2007-06-20 18:29 ` Daniel Jacobowitz

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=20070620182308.GA7859@lucon.org \
    --to=hjl@lucon.org \
    --cc=gdb-patches@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