diff --git a/gdb-bz623749-gcore-relro-1of2.patch b/gdb-bz623749-gcore-relro-1of2.patch new file mode 100755 index 0000000..232d56e --- /dev/null +++ b/gdb-bz623749-gcore-relro-1of2.patch @@ -0,0 +1,268 @@ +Re: [patch] Code cleanup: Make function typedef for find memory region +http://sourceware.org/ml/gdb-patches/2010-08/msg00554.html + +commit 0f12b4e58217ed2d8c085cf3a0328d1d8e014e9d +Author: Jan Kratochvil +Date: Tue Aug 31 18:08:42 2010 +0000 + + gdb/ + Code cleanup. + * defs.h (find_memory_region_ftype): New typedef. + (exec_set_find_memory_regions): Use it. + * exec.c (exec_set_find_memory_regions): Use find_memory_region_ftype. + * fbsd-nat.c (fbsd_find_memory_regions): Likewise. + * gcore.c (objfile_find_memory_regions): Likewise. + * gnu-nat.c (gnu_find_memory_regions): Likewise. + * linux-nat.c (linux_nat_find_memory_regions): Likewise. + * procfs.c (iterate_over_mappings_cb_ftype): Remove. + (iterate_over_mappings): Rename iterate_over_mappings_cb_ftype to + find_memory_region_ftype. + (insert_dbx_link_bpt_in_region): Likewise. + (iterate_over_mappings): Likewise. Drop the comment part about the + function prototype. + (find_memory_regions_callback): Use find_memory_region_ftype. + (proc_find_memory_regions): Likewise. + (info_mappings_callback): Rename iterate_over_mappings_cb_ftype to + find_memory_region_ftype. + * target.c (dummy_find_memory_regions): Use find_memory_region_ftype. + * target.h (struct target_ops) : Likewise. + +### a/gdb/ChangeLog +### b/gdb/ChangeLog +## -1,3 +1,26 @@ ++2010-08-31 Jan Kratochvil ++ ++ Code cleanup. ++ * defs.h (find_memory_region_ftype): New typedef. ++ (exec_set_find_memory_regions): Use it. ++ * exec.c (exec_set_find_memory_regions): Use find_memory_region_ftype. ++ * fbsd-nat.c (fbsd_find_memory_regions): Likewise. ++ * gcore.c (objfile_find_memory_regions): Likewise. ++ * gnu-nat.c (gnu_find_memory_regions): Likewise. ++ * linux-nat.c (linux_nat_find_memory_regions): Likewise. ++ * procfs.c (iterate_over_mappings_cb_ftype): Remove. ++ (iterate_over_mappings): Rename iterate_over_mappings_cb_ftype to ++ find_memory_region_ftype. ++ (insert_dbx_link_bpt_in_region): Likewise. ++ (iterate_over_mappings): Likewise. Drop the comment part about the ++ function prototype. ++ (find_memory_regions_callback): Use find_memory_region_ftype. ++ (proc_find_memory_regions): Likewise. ++ (info_mappings_callback): Rename iterate_over_mappings_cb_ftype to ++ find_memory_region_ftype. ++ * target.c (dummy_find_memory_regions): Use find_memory_region_ftype. ++ * target.h (struct target_ops) : Likewise. ++ + 2010-08-31 Sami Wagiaalla + + * psymtab.c (add_psymbol_to_bcache): Remove 'static' from +--- a/gdb/defs.h ++++ b/gdb/defs.h +@@ -634,12 +634,13 @@ extern void init_source_path (void); + + /* From exec.c */ + ++typedef int (*find_memory_region_ftype) (CORE_ADDR addr, unsigned long size, ++ int read, int write, int exec, ++ void *data); ++ + /* Take over the 'find_mapped_memory' vector from exec.c. */ +-extern void exec_set_find_memory_regions (int (*) (int (*) (CORE_ADDR, +- unsigned long, +- int, int, int, +- void *), +- void *)); ++extern void exec_set_find_memory_regions ++ (int (*func) (find_memory_region_ftype func, void *data)); + + /* Possible lvalue types. Like enum language, this should be in + value.h, but needs to be here for the same reason. */ +--- a/gdb/exec.c ++++ b/gdb/exec.c +@@ -835,11 +835,7 @@ exec_has_memory (struct target_ops *ops) + /* Find mapped memory. */ + + extern void +-exec_set_find_memory_regions (int (*func) (int (*) (CORE_ADDR, +- unsigned long, +- int, int, int, +- void *), +- void *)) ++exec_set_find_memory_regions (int (*func) (find_memory_region_ftype, void *)) + { + exec_ops.to_find_memory_regions = func; + } +--- a/gdb/fbsd-nat.c ++++ b/gdb/fbsd-nat.c +@@ -92,9 +92,7 @@ fbsd_read_mapping (FILE *mapfile, unsigned long *start, unsigned long *end, + argument to FUNC. */ + + int +-fbsd_find_memory_regions (int (*func) (CORE_ADDR, unsigned long, +- int, int, int, void *), +- void *obfd) ++fbsd_find_memory_regions (find_memory_region_ftype func, void *obfd) + { + pid_t pid = ptid_get_pid (inferior_ptid); + char *mapfilename; +--- a/gdb/gcore.c ++++ b/gdb/gcore.c +@@ -462,9 +462,7 @@ gcore_create_callback (CORE_ADDR vaddr, unsigned long size, + } + + static int +-objfile_find_memory_regions (int (*func) (CORE_ADDR, unsigned long, +- int, int, int, void *), +- void *obfd) ++objfile_find_memory_regions (find_memory_region_ftype func, void *obfd) + { + /* Use objfile data to create memory sections. */ + struct objfile *objfile; +--- a/gdb/gnu-nat.c ++++ b/gdb/gnu-nat.c +@@ -2487,11 +2487,7 @@ gnu_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, + + /* Call FUNC on each memory region in the task. */ + static int +-gnu_find_memory_regions (int (*func) (CORE_ADDR, +- unsigned long, +- int, int, int, +- void *), +- void *data) ++gnu_find_memory_regions (find_memory_region_ftype func, void *data) + { + error_t err; + task_t task; +--- a/gdb/linux-nat.c ++++ b/gdb/linux-nat.c +@@ -4104,9 +4104,7 @@ read_mapping (FILE *mapfile, + regions in the inferior for a corefile. */ + + static int +-linux_nat_find_memory_regions (int (*func) (CORE_ADDR, +- unsigned long, +- int, int, int, void *), void *obfd) ++linux_nat_find_memory_regions (find_memory_region_ftype func, void *obfd) + { + int pid = PIDGET (inferior_ptid); + char mapsfilename[MAXPATHLEN]; +--- a/gdb/procfs.c ++++ b/gdb/procfs.c +@@ -438,17 +438,9 @@ static void free_syscalls (procinfo *pi); + static int find_syscall (procinfo *pi, char *name); + #endif /* DYNAMIC_SYSCALLS */ + +-/* A function type used as a callback back iterate_over_mappings. */ +-typedef int (iterate_over_mappings_cb_ftype) +- (CORE_ADDR vaddr, unsigned long size, int read, int write, int execute, +- void *data); +- + static int iterate_over_mappings +- (procinfo *pi, +- iterate_over_mappings_cb_ftype *child_func, +- void *data, +- int (*func) (struct prmap *map, +- iterate_over_mappings_cb_ftype *child_func, ++ (procinfo *pi, find_memory_region_ftype child_func, void *data, ++ int (*func) (struct prmap *map, find_memory_region_ftype child_func, + void *data)); + + /* The head of the procinfo list: */ +@@ -3784,7 +3776,7 @@ solib_mappings_callback (struct prmap *map, int (*func) (int, CORE_ADDR), + + static int + insert_dbx_link_bpt_in_region (struct prmap *map, +- iterate_over_mappings_cb_ftype *child_func, ++ find_memory_region_ftype child_func, + void *data) + { + procinfo *pi = (procinfo *) data; +@@ -5226,11 +5218,10 @@ procfs_use_watchpoints (struct target_ops *t) + from the callback function, or zero. */ + + static int +-iterate_over_mappings (procinfo *pi, +- iterate_over_mappings_cb_ftype *child_func, ++iterate_over_mappings (procinfo *pi, find_memory_region_ftype child_func, + void *data, + int (*func) (struct prmap *map, +- iterate_over_mappings_cb_ftype *child_func, ++ find_memory_region_ftype child_func, + void *data)) + { + char pathname[MAX_PROC_NAME_SIZE]; +@@ -5282,23 +5273,12 @@ iterate_over_mappings (procinfo *pi, + } + + /* Implements the to_find_memory_regions method. Calls an external +- function for each memory region. The external function will have +- the signature: +- +- int callback (CORE_ADDR vaddr, +- unsigned long size, +- int read, int write, int execute, +- void *data); +- ++ function for each memory region. + Returns the integer value returned by the callback. */ + + static int + find_memory_regions_callback (struct prmap *map, +- int (*func) (CORE_ADDR, +- unsigned long, +- int, int, int, +- void *), +- void *data) ++ find_memory_region_ftype func, void *data) + { + return (*func) ((CORE_ADDR) map->pr_vaddr, + map->pr_size, +@@ -5321,11 +5301,7 @@ find_memory_regions_callback (struct prmap *map, + the callback. */ + + static int +-proc_find_memory_regions (int (*func) (CORE_ADDR, +- unsigned long, +- int, int, int, +- void *), +- void *data) ++proc_find_memory_regions (find_memory_region_ftype func, void *data) + { + procinfo *pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); + +@@ -5364,8 +5340,7 @@ mappingflags (long flags) + mappings'. */ + + static int +-info_mappings_callback (struct prmap *map, +- iterate_over_mappings_cb_ftype *ignore, ++info_mappings_callback (struct prmap *map, find_memory_region_ftype ignore, + void *unused) + { + unsigned int pr_off; +--- a/gdb/target.c ++++ b/gdb/target.c +@@ -3005,7 +3005,7 @@ dummy_pid_to_str (struct target_ops *ops, ptid_t ptid) + + /* Error-catcher for target_find_memory_regions. */ + static int +-dummy_find_memory_regions (int (*ignore1) (), void *ignore2) ++dummy_find_memory_regions (find_memory_region_ftype ignore1, void *ignore2) + { + error (_("Command not implemented for this target.")); + return 0; +--- a/gdb/target.h ++++ b/gdb/target.h +@@ -504,11 +504,7 @@ struct target_ops + int (*to_async_mask) (int); + int (*to_supports_non_stop) (void); + /* find_memory_regions support method for gcore */ +- int (*to_find_memory_regions) (int (*) (CORE_ADDR, +- unsigned long, +- int, int, int, +- void *), +- void *); ++ int (*to_find_memory_regions) (find_memory_region_ftype func, void *data); + /* make_corefile_notes support method for gcore */ + char * (*to_make_corefile_notes) (bfd *, int *); + /* get_bookmark support method for bookmarks */ diff --git a/gdb-bz623749-gcore-relro-2of2.patch b/gdb-bz623749-gcore-relro-2of2.patch new file mode 100644 index 0000000..3a370a8 --- /dev/null +++ b/gdb-bz623749-gcore-relro-2of2.patch @@ -0,0 +1,449 @@ +http://sourceware.org/ml/gdb-patches/2010-09/msg00395.html +Subject: Re: [patch] Fix gcore writer for -Wl,-z,relro (PR corefiles/11804) + +Hi, + +a slight warning() improvement. + +There was a hint + http://sourceware.org/bugzilla/show_bug.cgi?id=11804#c12 +it may not always work right but that would be just a Linux kernel bug so that +GDB part should be OK. Also it cannot be a regression, only more pages may be +written out with this patch. + + +Thanks, +Jan + + +On Tue, 31 Aug 2010 19:28:57 +0200, Jan Kratochvil wrote: +> technical rediff due to the patch update: +> +> On Mon, 30 Aug 2010 11:15:21 +0200, Jan Kratochvil wrote: +> Hi, +> +> currently for -Wl,-z,relro executables GDB will not dump the DYNAMIC segment +> into the core file, failing to read shared library list later. +> +> (gdb) info sharedlibrary +> >From To Syms Read Shared Object Library +> 0x00007ffff7dddb20 0x00007ffff7df5c74 Yes /lib64/ld-linux-x86-64.so.2 +> +> This is just the fallback, GDB considers the executable uninitialized with +> DT_DEBUG value zero. +> +> Linux kernel dumps it correctly, respecting if the page got ever modified +> since being read from the disk, even if it is not (no longer) writable. +> +> No regressions on {x86_64,x86_64-m32,i686}-fedora14snapshot-linux-gnu. +> +> The "Shared_Dirty:" / "Private_Dirty:" / "Swap:" rule has been suggested by +> Roland McGrath and confirmed by Larry Woodman. + + +gdb/ +2010-09-22 Jan Kratochvil + + Fix gcore writer for -Wl,-z,relro. + * defs.h (find_memory_region_ftype): New parameter `modified'. New + comment. + * fbsd-nat.c (fbsd_find_memory_regions): Pass -1 to func. + * gcore.c (gcore_create_callback): New parameter `modified'. + Consider segment as unmodified only if also MODIFIED is 0. Set + SEC_READONLY just according to WRITE. + (objfile_find_memory_regions): Pass new values for the `modified' + parameter. + * gnu-nat.c (gnu_find_memory_regions): Pass -1 for the + `modified' parameter. + * linux-nat.c (read_mapping): New parameters mapfilename and modified. + (linux_nat_find_memory_regions): New variable `modified'. Try + "/proc/%d/smaps" first. Pass `&modified' and `mapsfilename' to + read_mapping. Call func with MODIFIED. + (linux_nat_info_proc_cmd): Pass `fname1' and NULL to read_mapping. + * procfs.c (find_memory_regions_callback): Pass -1 for the `modified' + parameter. + +gdb/testsuite/ +2010-09-22 Jan Kratochvil + + Fix gcore writer for -Wl,-z,relro. + * gdb.base/gcore-relro.exp: New file. + * gdb.base/gcore-relro-main.c: New file. + * gdb.base/gcore-relro-lib.c: New file. + +--- a/gdb/defs.h ++++ b/gdb/defs.h +@@ -638,9 +638,10 @@ extern void init_source_path (void); + + /* From exec.c */ + ++/* MODIFIED has value -1 for unknown, 0 for not modified, 1 for modified. */ + typedef int (*find_memory_region_ftype) (CORE_ADDR addr, unsigned long size, + int read, int write, int exec, +- void *data); ++ int modified, void *data); + + /* Take over the 'find_mapped_memory' vector from exec.c. */ + extern void exec_set_find_memory_regions +--- a/gdb/fbsd-nat.c ++++ b/gdb/fbsd-nat.c +@@ -133,7 +133,7 @@ fbsd_find_memory_regions (find_memory_region_ftype func, void *obfd) + } + + /* Invoke the callback function to create the corefile segment. */ +- func (start, size, read, write, exec, obfd); ++ func (start, size, read, write, exec, -1, obfd); + } + + do_cleanups (cleanup); +--- a/gdb/gcore.c ++++ b/gdb/gcore.c +@@ -378,8 +378,8 @@ make_output_phdrs (bfd *obfd, asection *osec, void *ignored) + } + + 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; +@@ -388,7 +388,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) + { +@@ -399,7 +399,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. */ +@@ -431,10 +431,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 +@@ -484,6 +486,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. */ + obfd); + if (ret != 0) + return ret; +@@ -496,6 +499,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. */ +@@ -504,6 +508,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; +--- a/gdb/gnu-nat.c ++++ b/gdb/gnu-nat.c +@@ -2544,7 +2544,7 @@ gnu_find_memory_regions (find_memory_region_ftype func, void *data) + last_protection & VM_PROT_READ, + last_protection & VM_PROT_WRITE, + last_protection & VM_PROT_EXECUTE, +- data); ++ -1, data); + last_region_address = region_address; + last_region_end = region_address += region_length; + last_protection = protection; +@@ -2557,7 +2557,7 @@ gnu_find_memory_regions (find_memory_region_ftype func, void *data) + last_protection & VM_PROT_READ, + last_protection & VM_PROT_WRITE, + last_protection & VM_PROT_EXECUTE, +- data); ++ -1, data); + + return 0; + } +--- a/gdb/linux-nat.c ++++ b/gdb/linux-nat.c +@@ -4078,12 +4078,9 @@ linux_child_pid_to_exec_file (int pid) + /* Service function for corefiles and info proc. */ + + static int +-read_mapping (FILE *mapfile, +- long long *addr, +- long long *endaddr, +- char *permissions, +- long long *offset, +- char *device, long long *inode, char *filename) ++read_mapping (FILE *mapfile, const char *mapfilename, long long *addr, ++ long long *endaddr, char *permissions, long long *offset, ++ char *device, long long *inode, char *filename, int *modified) + { + int ret = fscanf (mapfile, "%llx-%llx %s %llx %s %llx", + addr, endaddr, permissions, offset, device, inode); +@@ -4101,6 +4098,41 @@ read_mapping (FILE *mapfile, + ret += fscanf (mapfile, "%[^\n]\n", filename); + } + ++ if (modified != NULL) ++ { ++ *modified = -1; ++ for (;;) ++ { ++ int ch, got; ++ char keyword[64 + 1]; ++ unsigned long number; ++ ++ ch = fgetc (mapfile); ++ if (ch != EOF) ++ ungetc (ch, mapfile); ++ if (ch < 'A' || ch > 'Z') ++ break; ++ got = fscanf (mapfile, "%64s%lu", keyword, &number); ++ do ++ ch = fgetc (mapfile); ++ while (ch != EOF && ch != '\n'); ++ if (got != 2) ++ { ++ warning (_("Error parsing file %s"), mapfilename); ++ break; ++ } ++ if (number != 0 && (strcmp (keyword, "Shared_Dirty:") == 0 ++ || strcmp (keyword, "Private_Dirty:") == 0 ++ || strcmp (keyword, "Swap:") == 0)) ++ *modified = 1; ++ else if (*modified == -1) ++ { ++ /* A valid line proves an smaps file is being read in. */ ++ *modified = 0; ++ } ++ } ++ } ++ + return (ret != 0 && ret != EOF); + } + +@@ -4115,13 +4147,17 @@ linux_nat_find_memory_regions (find_memory_region_ftype func, void *obfd) + FILE *mapsfile; + long long addr, endaddr, size, offset, inode; + char permissions[8], device[8], filename[MAXPATHLEN]; +- int read, write, exec; ++ int read, write, exec, modified; + struct cleanup *cleanup; + + /* Compose the filename for the /proc memory map, and open it. */ +- sprintf (mapsfilename, "/proc/%d/maps", pid); ++ sprintf (mapsfilename, "/proc/%d/smaps", pid); + if ((mapsfile = fopen (mapsfilename, "r")) == NULL) +- error (_("Could not open %s."), mapsfilename); ++ { ++ sprintf (mapsfilename, "/proc/%d/maps", pid); ++ if ((mapsfile = fopen (mapsfilename, "r")) == NULL) ++ error (_("Could not open %s."), mapsfilename); ++ } + cleanup = make_cleanup_fclose (mapsfile); + + if (info_verbose) +@@ -4129,8 +4165,9 @@ linux_nat_find_memory_regions (find_memory_region_ftype func, void *obfd) + "Reading memory regions from %s\n", mapsfilename); + + /* Now iterate until end-of-file. */ +- while (read_mapping (mapsfile, &addr, &endaddr, &permissions[0], +- &offset, &device[0], &inode, &filename[0])) ++ while (read_mapping (mapsfile, mapsfilename, &addr, &endaddr, ++ &permissions[0], &offset, &device[0], &inode, ++ &filename[0], &modified)) + { + size = endaddr - addr; + +@@ -4153,7 +4190,7 @@ linux_nat_find_memory_regions (find_memory_region_ftype func, void *obfd) + + /* Invoke the callback function to create the corefile + segment. */ +- func (addr, size, read, write, exec, obfd); ++ func (addr, size, read, write, exec, modified, obfd); + } + do_cleanups (cleanup); + return 0; +@@ -4615,8 +4652,9 @@ linux_nat_info_proc_cmd (char *args, int from_tty) + " Size", " Offset", "objfile"); + } + +- while (read_mapping (procfile, &addr, &endaddr, &permissions[0], +- &offset, &device[0], &inode, &filename[0])) ++ while (read_mapping (procfile, fname1, &addr, &endaddr, ++ &permissions[0], &offset, &device[0], &inode, ++ &filename[0], NULL)) + { + size = endaddr - addr; + +--- a/gdb/procfs.c ++++ b/gdb/procfs.c +@@ -5285,7 +5285,7 @@ find_memory_regions_callback (struct prmap *map, + (map->pr_mflags & MA_READ) != 0, + (map->pr_mflags & MA_WRITE) != 0, + (map->pr_mflags & MA_EXEC) != 0, +- data); ++ -1, data); + } + + /* External interface. Calls a callback function once for each +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-relro-lib.c +@@ -0,0 +1,21 @@ ++/* Copyright 2010 Free Software Foundation, Inc. ++ ++ This file is part of GDB. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++void ++lib (void) ++{ ++} +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-relro-main.c +@@ -0,0 +1,25 @@ ++/* Copyright 2010 Free Software Foundation, Inc. ++ ++ This file is part of GDB. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++extern void lib (void); ++ ++int ++main (void) ++{ ++ lib (); ++ return 0; ++} +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-relro.exp +@@ -0,0 +1,80 @@ ++# Copyright 2010 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++if {[skip_shlib_tests]} { ++ return 0 ++} ++ ++set testfile "gcore-relro" ++set srcmainfile ${testfile}-main.c ++set srclibfile ${testfile}-lib.c ++set libfile ${objdir}/${subdir}/${testfile}-lib.so ++set objfile ${objdir}/${subdir}/${testfile}-main.o ++set executable ${testfile}-main ++set binfile ${objdir}/${subdir}/${executable} ++set gcorefile ${objdir}/${subdir}/${executable}.gcore ++ ++if { [gdb_compile_shlib ${srcdir}/${subdir}/${srclibfile} ${libfile} {debug}] != "" ++ || [gdb_compile ${srcdir}/${subdir}/${srcmainfile} ${objfile} object {debug}] != "" } { ++ untested ${testfile}.exp ++ return -1 ++} ++set opts [list debug shlib=${libfile} additional_flags=-Wl,-z,relro] ++if { [gdb_compile ${objfile} ${binfile} executable $opts] != "" } { ++ unsupported "-Wl,-z,relro compilation failed" ++ return -1 ++} ++ ++clean_restart $executable ++gdb_load_shlibs $libfile ++ ++# Does this gdb support gcore? ++set test "help gcore" ++gdb_test_multiple $test $test { ++ -re "Undefined command: .gcore.*\r\n$gdb_prompt $" { ++ # gcore command not supported -- nothing to test here. ++ unsupported "gdb does not support gcore on this target" ++ return -1; ++ } ++ -re "Save a core file .*\r\n$gdb_prompt $" { ++ pass $test ++ } ++} ++ ++if { ![runto lib] } then { ++ return -1 ++} ++ ++set escapedfilename [string_to_regexp ${gcorefile}] ++ ++set test "save a corefile" ++gdb_test_multiple "gcore ${gcorefile}" $test { ++ -re "Saved corefile ${escapedfilename}\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re "Can't create a corefile\r\n$gdb_prompt $" { ++ unsupported $test ++ return -1 ++ } ++} ++ ++# Now restart gdb and load the corefile. ++ ++clean_restart $executable ++gdb_load_shlibs $libfile ++ ++gdb_test "core ${gcorefile}" "Core was generated by .*" "re-load generated corefile" ++ ++gdb_test "frame" "#0 \[^\r\n\]* lib .*" "library got loaded" + diff --git a/gdb.spec b/gdb.spec index af6d198..e8dad99 100644 --- a/gdb.spec +++ b/gdb.spec @@ -27,7 +27,7 @@ Version: 7.2 # The release always contains a leading reserved number, start it at 1. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing. -Release: 8%{?_with_upstream:.upstream}%{dist} +Release: 9%{?_with_upstream:.upstream}%{dist} License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and GFDL and BSD and Public Domain Group: Development/Debuggers @@ -435,6 +435,10 @@ Patch502: gdb-bz634660-gdbpy-load-on-attach.patch # Fix double free crash during overload resolution (PR 12028, Sami Wagiaalla). Patch503: gdb-pr12028-double-free.patch +# Fix gcore writer for -Wl,-z,relro (PR corefiles/11804). +Patch504: gdb-bz623749-gcore-relro-1of2.patch +Patch505: gdb-bz623749-gcore-relro-2of2.patch + BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa} Requires: readline%{?_isa} BuildRequires: readline-devel%{?_isa} @@ -696,6 +700,8 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch501 -p1 %patch502 -p1 %patch503 -p1 +%patch504 -p1 +%patch505 -p1 %patch393 -p1 %patch335 -p1 @@ -1080,6 +1086,9 @@ fi %endif %changelog +* Wed Sep 22 2010 Jan Kratochvil - 7.2-9.fc14 +- Fix gcore writer for -Wl,-z,relro (PR corefiles/11804). + * Wed Sep 22 2010 Jan Kratochvil - 7.2-8.fc14 - Enable python by default even in Brew and on all the arches (BZ 609157).