* PATCH: Set SEC_NEVER_LOAD when clearing SEC_LOAD for gcore
@ 2007-06-20 18:23 H. J. Lu
2007-06-20 18:29 ` Daniel Jacobowitz
0 siblings, 1 reply; 2+ messages in thread
From: H. J. Lu @ 2007-06-20 18:23 UTC (permalink / raw)
To: GDB
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;
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: PATCH: Set SEC_NEVER_LOAD when clearing SEC_LOAD for gcore
2007-06-20 18:23 PATCH: Set SEC_NEVER_LOAD when clearing SEC_LOAD for gcore H. J. Lu
@ 2007-06-20 18:29 ` Daniel Jacobowitz
0 siblings, 0 replies; 2+ messages in thread
From: Daniel Jacobowitz @ 2007-06-20 18:29 UTC (permalink / raw)
To: H. J. Lu; +Cc: GDB
On Wed, Jun 20, 2007 at 11:23:08AM -0700, H. J. Lu wrote:
> 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.
OK, thanks.
--
Daniel Jacobowitz
CodeSourcery
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-06-20 18:29 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-06-20 18:23 PATCH: Set SEC_NEVER_LOAD when clearing SEC_LOAD for gcore H. J. Lu
2007-06-20 18:29 ` Daniel Jacobowitz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox