]> git.pld-linux.org Git - packages/gdb.git/blame - gdb-6.6-buildid-locate-solib-missing-ids.patch
- up to 8.3
[packages/gdb.git] / gdb-6.6-buildid-locate-solib-missing-ids.patch
CommitLineData
4b0e5c1b
AM
1From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
2From: Fedora GDB patches <invalid@email.com>
3Date: Fri, 27 Oct 2017 21:07:50 +0200
4Subject: gdb-6.6-buildid-locate-solib-missing-ids.patch
5
4b0e5c1b
AM
6;; Fix loading of core files without build-ids but with build-ids in executables.
7;; Load strictly build-id-checked core files only if no executable is specified
8;; (Jan Kratochvil, RH BZ 1339862).
9;;=push+jan
10
140f8057
JR
11gdb returns an incorrect back trace when applying a debuginfo
12https://bugzilla.redhat.com/show_bug.cgi?id=1339862
13
4b0e5c1b 14diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
4b0e5c1b
AM
15--- a/gdb/solib-svr4.c
16+++ b/gdb/solib-svr4.c
77d10998 17@@ -1347,14 +1347,27 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
a7de96f0
PS
18 }
19
20 {
324d13e1
JR
21- struct bfd_build_id *build_id;
22+ struct bfd_build_id *build_id = NULL;
a7de96f0 23
ed003b1c 24 strncpy (newobj->so_original_name, buffer.get (), SO_NAME_MAX_PATH_SIZE - 1);
324d13e1 25 newobj->so_original_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
a7de96f0 26 /* May get overwritten below. */
324d13e1 27 strcpy (newobj->so_name, newobj->so_original_name);
a7de96f0 28
ed003b1c 29- build_id = build_id_addr_get (((lm_info_svr4 *) newobj->lm_info)->l_ld);
a7de96f0
PS
30+ /* In the case the main executable was found according to its build-id
31+ (from a core file) prevent loading a different build of a library
32+ with accidentally the same SO_NAME.
33+
34+ It suppresses bogus backtraces (and prints "??" there instead) if
35+ the on-disk files no longer match the running program version.
36+
37+ If the main executable was not loaded according to its build-id do
38+ not do any build-id checking of the libraries. There may be missing
39+ build-ids dumped in the core file and we would map all the libraries
40+ to the only existing file loaded that time - the executable. */
41+ if (symfile_objfile != NULL
42+ && (symfile_objfile->flags & OBJF_BUILD_ID_CORE_LOADED) != 0)
4b0e5c1b 43+ build_id = build_id_addr_get (li->l_ld);
a7de96f0
PS
44 if (build_id != NULL)
45 {
46 char *name, *build_id_filename;
77d10998 47@@ -1369,23 +1382,7 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
a7de96f0
PS
48 xfree (name);
49 }
50 else
51- {
324d13e1 52- debug_print_missing (newobj->so_name, build_id_filename);
a7de96f0
PS
53-
54- /* In the case the main executable was found according to
55- its build-id (from a core file) prevent loading
56- a different build of a library with accidentally the
57- same SO_NAME.
58-
59- It suppresses bogus backtraces (and prints "??" there
60- instead) if the on-disk files no longer match the
61- running program version. */
62-
63- if (symfile_objfile != NULL
64- && (symfile_objfile->flags
65- & OBJF_BUILD_ID_CORE_LOADED) != 0)
324d13e1 66- newobj->so_name[0] = 0;
a7de96f0 67- }
324d13e1 68+ debug_print_missing (newobj->so_name, build_id_filename);
a7de96f0
PS
69
70 xfree (build_id_filename);
71 xfree (build_id);
4b0e5c1b
AM
72diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c
73new file mode 100644
4b0e5c1b
AM
74--- /dev/null
75+++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c
76@@ -0,0 +1,21 @@
77+/* Copyright 2010 Free Software Foundation, Inc.
78+
79+ This file is part of GDB.
80+
81+ This program is free software; you can redistribute it and/or modify
82+ it under the terms of the GNU General Public License as published by
83+ the Free Software Foundation; either version 3 of the License, or
84+ (at your option) any later version.
85+
86+ This program is distributed in the hope that it will be useful,
87+ but WITHOUT ANY WARRANTY; without even the implied warranty of
88+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
89+ GNU General Public License for more details.
90+
91+ You should have received a copy of the GNU General Public License
92+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
93+
94+void
95+lib (void)
96+{
97+}
98diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c
99new file mode 100644
4b0e5c1b
AM
100--- /dev/null
101+++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c
102@@ -0,0 +1,25 @@
103+/* Copyright 2010 Free Software Foundation, Inc.
104+
105+ This file is part of GDB.
106+
107+ This program is free software; you can redistribute it and/or modify
108+ it under the terms of the GNU General Public License as published by
109+ the Free Software Foundation; either version 3 of the License, or
110+ (at your option) any later version.
111+
112+ This program is distributed in the hope that it will be useful,
113+ but WITHOUT ANY WARRANTY; without even the implied warranty of
114+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
115+ GNU General Public License for more details.
116+
117+ You should have received a copy of the GNU General Public License
118+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
119+
120+extern void lib (void);
121+
122+int
123+main (void)
124+{
125+ lib ();
126+ return 0;
127+}
128diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp
129new file mode 100644
4b0e5c1b
AM
130--- /dev/null
131+++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp
140f8057
JR
132@@ -0,0 +1,105 @@
133+# Copyright 2016 Free Software Foundation, Inc.
134+
135+# This program is free software; you can redistribute it and/or modify
136+# it under the terms of the GNU General Public License as published by
137+# the Free Software Foundation; either version 3 of the License, or
138+# (at your option) any later version.
139+#
140+# This program is distributed in the hope that it will be useful,
141+# but WITHOUT ANY WARRANTY; without even the implied warranty of
142+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
143+# GNU General Public License for more details.
144+#
145+# You should have received a copy of the GNU General Public License
146+# along with this program. If not, see <http://www.gnu.org/licenses/>.
147+
148+if {[skip_shlib_tests]} {
149+ return 0
150+}
151+
152+set testfile "gcore-buildid-exec-but-not-solib"
153+set srcmainfile ${testfile}-main.c
154+set srclibfile ${testfile}-lib.c
155+set libfile [standard_output_file ${testfile}-lib.so]
156+set objfile [standard_output_file ${testfile}-main.o]
157+set executable ${testfile}-main
158+set binfile [standard_output_file ${executable}]
159+set gcorefile [standard_output_file ${executable}.gcore]
160+set outdir [file dirname $binfile]
161+
162+if { [gdb_compile_shlib ${srcdir}/${subdir}/${srclibfile} ${libfile} "debug additional_flags=-Wl,--build-id"] != ""
163+ || [gdb_compile ${srcdir}/${subdir}/${srcmainfile} ${objfile} object {debug}] != "" } {
164+ unsupported "-Wl,--build-id compilation failed"
165+ return -1
166+}
167+set opts [list debug shlib=${libfile} "additional_flags=-Wl,--build-id"]
168+if { [gdb_compile ${objfile} ${binfile} executable $opts] != "" } {
169+ unsupported "-Wl,--build-id compilation failed"
170+ return -1
171+}
172+
173+clean_restart $executable
174+gdb_load_shlib $libfile
175+
176+# Does this gdb support gcore?
177+set test "help gcore"
178+gdb_test_multiple $test $test {
179+ -re "Undefined command: .gcore.*\r\n$gdb_prompt $" {
180+ # gcore command not supported -- nothing to test here.
181+ unsupported "gdb does not support gcore on this target"
182+ return -1;
183+ }
184+ -re "Save a core file .*\r\n$gdb_prompt $" {
185+ pass $test
186+ }
187+}
188+
189+if { ![runto lib] } then {
190+ return -1
191+}
192+
193+set escapedfilename [string_to_regexp ${gcorefile}]
194+
195+set test "save a corefile"
196+gdb_test_multiple "gcore ${gcorefile}" $test {
197+ -re "Saved corefile ${escapedfilename}\r\n$gdb_prompt $" {
198+ pass $test
199+ }
200+ -re "Can't create a corefile\r\n$gdb_prompt $" {
201+ unsupported $test
202+ return -1
203+ }
204+}
205+
206+# Now restart gdb and load the corefile.
207+
208+clean_restart $executable
209+gdb_load_shlib $libfile
210+
211+set buildid [build_id_debug_filename_get $libfile]
212+
213+regsub {\.debug$} $buildid {} buildid
214+
215+set debugdir [standard_output_file ${testfile}-debugdir]
216+file delete -force -- $debugdir
217+
218+file mkdir $debugdir/[file dirname $libfile]
219+file copy $libfile $debugdir/${libfile}
220+
221+file mkdir $debugdir/[file dirname $buildid]
222+file copy $libfile $debugdir/${buildid}
223+
224+remote_exec build "ln -s /lib ${debugdir}/"
225+remote_exec build "ln -s /lib64 ${debugdir}/"
226+# /usr is not needed, all the libs are in /lib64: libm.so.6 libc.so.6 ld-linux-x86-64.so.2
227+
228+gdb_test "set solib-absolute-prefix $debugdir"
229+
230+gdb_test_no_output "set debug-file-directory $debugdir" "set debug-file-directory"
231+
232+gdb_test "core ${gcorefile}" "Core was generated by .*" "re-load generated corefile"
233+
234+gdb_test "frame" "#0 \[^\r\n\]* lib .*" "library got loaded"
235+
236+gdb_test "bt"
237+gdb_test "info shared"
This page took 0.107309 seconds and 4 git commands to generate.