]>
Commit | Line | Data |
---|---|---|
4b0e5c1b AM |
1 | From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 |
2 | From: Fedora GDB patches <invalid@email.com> | |
3 | Date: Fri, 27 Oct 2017 21:07:50 +0200 | |
4 | Subject: 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 |
11 | gdb returns an incorrect back trace when applying a debuginfo |
12 | https://bugzilla.redhat.com/show_bug.cgi?id=1339862 | |
13 | ||
4b0e5c1b | 14 | diff --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 |
72 | diff --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 |
73 | new 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 | +} | |
98 | diff --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 | |
99 | new 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 | +} | |
128 | diff --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 | |
129 | new 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" |