summaryrefslogtreecommitdiffstats
path: root/gdb/gcore.c
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2012-08-07 13:26:33 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2012-08-07 13:26:33 +0000
commit4f69f4c267a21e787685116945fb40729a7297a5 (patch)
treeccffd19fbc910eedac303b46c8c4bad9db964b76 /gdb/gcore.c
parent82435b3b3da1b288ca2d2596a9de40e6bc734773 (diff)
downloadppe42-binutils-4f69f4c267a21e787685116945fb40729a7297a5.tar.gz
ppe42-binutils-4f69f4c267a21e787685116945fb40729a7297a5.zip
gdb/
PR 11804 * defs.h (find_memory_region_ftype): New comment. New arg modified. * fbsd-nat.c (fbsd_find_memory_regions): Add the passed modified value. * gcore.c (gcore_create_callback): New function comment. Add modified parameter. Only write modified regions. Set SEC_READONLY exactly according to MODIFIED. (objfile_find_memory_regions): Ignore separate debug info files. Ass the passed modified value to FUNC. * gnu-nat.c (gnu_find_memory_regions): Add the passed modified value. * linux-tdep.c (linux_find_memory_regions): Try to reads smaps file first. New variables modified and has_anonymous. Parse the lines of smaps file. Add the passed MODIFIED value to FUNC. * procfs.c (find_memory_regions_callback): Add the passed modified value. gdb/testsuite/ PR 11804 * gdb.base/gcore-relro.exp: New file. * gdb.base/gcore-relro-main.c: New file. * gdb.base/gcore-relro-lib.c: New file.
Diffstat (limited to 'gdb/gcore.c')
-rw-r--r--gdb/gcore.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/gdb/gcore.c b/gdb/gcore.c
index a45e787739..3c8e2f43fb 100644
--- a/gdb/gcore.c
+++ b/gdb/gcore.c
@@ -379,9 +379,12 @@ make_output_phdrs (bfd *obfd, asection *osec, void *ignored)
bfd_record_phdr (obfd, p_type, 1, p_flags, 0, 0, 0, 0, 1, &osec);
}
+/* find_memory_region_ftype implementation. DATA is 'bfd *' for the core file
+ GDB is creating. */
+
static int
-gcore_create_callback (CORE_ADDR vaddr, unsigned long size,
- int read, int write, int exec, void *data)
+gcore_create_callback (CORE_ADDR vaddr, unsigned long size, int read,
+ int write, int exec, int modified, void *data)
{
bfd *obfd = data;
asection *osec;
@@ -390,7 +393,7 @@ gcore_create_callback (CORE_ADDR vaddr, unsigned long size,
/* If the memory segment has no permissions set, ignore it, otherwise
when we later try to access it for read/write, we'll get an error
or jam the kernel. */
- if (read == 0 && write == 0 && exec == 0)
+ if (read == 0 && write == 0 && exec == 0 && modified == 0)
{
if (info_verbose)
{
@@ -401,7 +404,7 @@ gcore_create_callback (CORE_ADDR vaddr, unsigned long size,
return 0;
}
- if (write == 0 && !solib_keep_data_in_core (vaddr, size))
+ if (write == 0 && modified == 0 && !solib_keep_data_in_core (vaddr, size))
{
/* See if this region of memory lies inside a known file on disk.
If so, we can avoid copying its contents by clearing SEC_LOAD. */
@@ -433,10 +436,12 @@ gcore_create_callback (CORE_ADDR vaddr, unsigned long size,
}
}
- keep:
- flags |= SEC_READONLY;
+ keep:;
}
+ if (write == 0)
+ flags |= SEC_READONLY;
+
if (exec)
flags |= SEC_CODE;
else
@@ -477,6 +482,10 @@ objfile_find_memory_regions (find_memory_region_ftype func, void *obfd)
asection *isec = objsec->the_bfd_section;
flagword flags = bfd_get_section_flags (ibfd, isec);
+ /* Separate debug info files are irrelevant for gcore. */
+ if (objfile->separate_debug_objfile_backlink != NULL)
+ continue;
+
if ((flags & SEC_ALLOC) || (flags & SEC_LOAD))
{
int size = bfd_section_size (ibfd, isec);
@@ -486,6 +495,7 @@ objfile_find_memory_regions (find_memory_region_ftype func, void *obfd)
1, /* All sections will be readable. */
(flags & SEC_READONLY) == 0, /* Writable. */
(flags & SEC_CODE) != 0, /* Executable. */
+ 1, /* MODIFIED is unknown, pass it as true. */
obfd);
if (ret != 0)
return ret;
@@ -498,6 +508,7 @@ objfile_find_memory_regions (find_memory_region_ftype func, void *obfd)
1, /* Stack section will be readable. */
1, /* Stack section will be writable. */
0, /* Stack section will not be executable. */
+ 1, /* Stack section will be modified. */
obfd);
/* Make a heap segment. */
@@ -506,6 +517,7 @@ objfile_find_memory_regions (find_memory_region_ftype func, void *obfd)
1, /* Heap section will be readable. */
1, /* Heap section will be writable. */
0, /* Heap section will not be executable. */
+ 1, /* Heap section will be modified. */
obfd);
return 0;
OpenPOWER on IntegriCloud