This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
PATCH: Set SEC_NEVER_LOAD when clearing SEC_LOAD for gcore
- From: "H. J. Lu" <hjl at lucon dot org>
- To: GDB <gdb-patches at sources dot redhat dot com>
- Date: Wed, 20 Jun 2007 11:23:08 -0700
- Subject: PATCH: Set SEC_NEVER_LOAD when clearing SEC_LOAD for gcore
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;
}