]>
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 | |
5673f127 | 17 | @@ -1320,14 +1320,28 @@ svr4_read_so_list (svr4_info *info, 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. */ | |
1d2a824d JP |
41 | + if (current_program_space->symfile_object_file != NULL |
42 | + && (current_program_space->symfile_object_file->flags | |
43 | + & OBJF_BUILD_ID_CORE_LOADED) != 0) | |
4b0e5c1b | 44 | + build_id = build_id_addr_get (li->l_ld); |
a7de96f0 PS |
45 | if (build_id != NULL) |
46 | { | |
47 | char *name, *build_id_filename; | |
5673f127 | 48 | @@ -1342,23 +1356,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, |
a7de96f0 PS |
49 | xfree (name); |
50 | } | |
51 | else | |
52 | - { | |
324d13e1 | 53 | - debug_print_missing (newobj->so_name, build_id_filename); |
a7de96f0 PS |
54 | - |
55 | - /* In the case the main executable was found according to | |
56 | - its build-id (from a core file) prevent loading | |
57 | - a different build of a library with accidentally the | |
58 | - same SO_NAME. | |
59 | - | |
60 | - It suppresses bogus backtraces (and prints "??" there | |
61 | - instead) if the on-disk files no longer match the | |
62 | - running program version. */ | |
63 | - | |
1d2a824d JP |
64 | - if (current_program_space->symfile_object_file != NULL |
65 | - && (current_program_space->symfile_object_file->flags | |
a7de96f0 | 66 | - & OBJF_BUILD_ID_CORE_LOADED) != 0) |
324d13e1 | 67 | - newobj->so_name[0] = 0; |
a7de96f0 | 68 | - } |
324d13e1 | 69 | + debug_print_missing (newobj->so_name, build_id_filename); |
a7de96f0 PS |
70 | |
71 | xfree (build_id_filename); | |
72 | xfree (build_id); | |
4b0e5c1b AM |
73 | 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 |
74 | new file mode 100644 | |
4b0e5c1b AM |
75 | --- /dev/null |
76 | +++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c | |
77 | @@ -0,0 +1,21 @@ | |
78 | +/* Copyright 2010 Free Software Foundation, Inc. | |
79 | + | |
80 | + This file is part of GDB. | |
81 | + | |
82 | + This program is free software; you can redistribute it and/or modify | |
83 | + it under the terms of the GNU General Public License as published by | |
84 | + the Free Software Foundation; either version 3 of the License, or | |
85 | + (at your option) any later version. | |
86 | + | |
87 | + This program is distributed in the hope that it will be useful, | |
88 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
89 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
90 | + GNU General Public License for more details. | |
91 | + | |
92 | + You should have received a copy of the GNU General Public License | |
93 | + along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
94 | + | |
95 | +void | |
96 | +lib (void) | |
97 | +{ | |
98 | +} | |
99 | 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 | |
100 | new file mode 100644 | |
4b0e5c1b AM |
101 | --- /dev/null |
102 | +++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c | |
103 | @@ -0,0 +1,25 @@ | |
104 | +/* Copyright 2010 Free Software Foundation, Inc. | |
105 | + | |
106 | + This file is part of GDB. | |
107 | + | |
108 | + This program is free software; you can redistribute it and/or modify | |
109 | + it under the terms of the GNU General Public License as published by | |
110 | + the Free Software Foundation; either version 3 of the License, or | |
111 | + (at your option) any later version. | |
112 | + | |
113 | + This program is distributed in the hope that it will be useful, | |
114 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
115 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
116 | + GNU General Public License for more details. | |
117 | + | |
118 | + You should have received a copy of the GNU General Public License | |
119 | + along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
120 | + | |
121 | +extern void lib (void); | |
122 | + | |
123 | +int | |
124 | +main (void) | |
125 | +{ | |
126 | + lib (); | |
127 | + return 0; | |
128 | +} | |
129 | 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 | |
130 | new file mode 100644 | |
4b0e5c1b AM |
131 | --- /dev/null |
132 | +++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp | |
140f8057 JR |
133 | @@ -0,0 +1,105 @@ |
134 | +# Copyright 2016 Free Software Foundation, Inc. | |
135 | + | |
136 | +# This program is free software; you can redistribute it and/or modify | |
137 | +# it under the terms of the GNU General Public License as published by | |
138 | +# the Free Software Foundation; either version 3 of the License, or | |
139 | +# (at your option) any later version. | |
140 | +# | |
141 | +# This program is distributed in the hope that it will be useful, | |
142 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
143 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
144 | +# GNU General Public License for more details. | |
145 | +# | |
146 | +# You should have received a copy of the GNU General Public License | |
147 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. | |
148 | + | |
149 | +if {[skip_shlib_tests]} { | |
150 | + return 0 | |
151 | +} | |
152 | + | |
153 | +set testfile "gcore-buildid-exec-but-not-solib" | |
154 | +set srcmainfile ${testfile}-main.c | |
155 | +set srclibfile ${testfile}-lib.c | |
156 | +set libfile [standard_output_file ${testfile}-lib.so] | |
157 | +set objfile [standard_output_file ${testfile}-main.o] | |
158 | +set executable ${testfile}-main | |
159 | +set binfile [standard_output_file ${executable}] | |
160 | +set gcorefile [standard_output_file ${executable}.gcore] | |
161 | +set outdir [file dirname $binfile] | |
162 | + | |
163 | +if { [gdb_compile_shlib ${srcdir}/${subdir}/${srclibfile} ${libfile} "debug additional_flags=-Wl,--build-id"] != "" | |
164 | + || [gdb_compile ${srcdir}/${subdir}/${srcmainfile} ${objfile} object {debug}] != "" } { | |
165 | + unsupported "-Wl,--build-id compilation failed" | |
166 | + return -1 | |
167 | +} | |
168 | +set opts [list debug shlib=${libfile} "additional_flags=-Wl,--build-id"] | |
169 | +if { [gdb_compile ${objfile} ${binfile} executable $opts] != "" } { | |
170 | + unsupported "-Wl,--build-id compilation failed" | |
171 | + return -1 | |
172 | +} | |
173 | + | |
174 | +clean_restart $executable | |
175 | +gdb_load_shlib $libfile | |
176 | + | |
177 | +# Does this gdb support gcore? | |
178 | +set test "help gcore" | |
179 | +gdb_test_multiple $test $test { | |
180 | + -re "Undefined command: .gcore.*\r\n$gdb_prompt $" { | |
181 | + # gcore command not supported -- nothing to test here. | |
182 | + unsupported "gdb does not support gcore on this target" | |
183 | + return -1; | |
184 | + } | |
185 | + -re "Save a core file .*\r\n$gdb_prompt $" { | |
186 | + pass $test | |
187 | + } | |
188 | +} | |
189 | + | |
190 | +if { ![runto lib] } then { | |
191 | + return -1 | |
192 | +} | |
193 | + | |
194 | +set escapedfilename [string_to_regexp ${gcorefile}] | |
195 | + | |
196 | +set test "save a corefile" | |
197 | +gdb_test_multiple "gcore ${gcorefile}" $test { | |
198 | + -re "Saved corefile ${escapedfilename}\r\n$gdb_prompt $" { | |
199 | + pass $test | |
200 | + } | |
201 | + -re "Can't create a corefile\r\n$gdb_prompt $" { | |
202 | + unsupported $test | |
203 | + return -1 | |
204 | + } | |
205 | +} | |
206 | + | |
207 | +# Now restart gdb and load the corefile. | |
208 | + | |
209 | +clean_restart $executable | |
210 | +gdb_load_shlib $libfile | |
211 | + | |
212 | +set buildid [build_id_debug_filename_get $libfile] | |
213 | + | |
214 | +regsub {\.debug$} $buildid {} buildid | |
215 | + | |
216 | +set debugdir [standard_output_file ${testfile}-debugdir] | |
217 | +file delete -force -- $debugdir | |
218 | + | |
219 | +file mkdir $debugdir/[file dirname $libfile] | |
220 | +file copy $libfile $debugdir/${libfile} | |
221 | + | |
222 | +file mkdir $debugdir/[file dirname $buildid] | |
223 | +file copy $libfile $debugdir/${buildid} | |
224 | + | |
225 | +remote_exec build "ln -s /lib ${debugdir}/" | |
226 | +remote_exec build "ln -s /lib64 ${debugdir}/" | |
227 | +# /usr is not needed, all the libs are in /lib64: libm.so.6 libc.so.6 ld-linux-x86-64.so.2 | |
228 | + | |
229 | +gdb_test "set solib-absolute-prefix $debugdir" | |
230 | + | |
231 | +gdb_test_no_output "set debug-file-directory $debugdir" "set debug-file-directory" | |
232 | + | |
233 | +gdb_test "core ${gcorefile}" "Core was generated by .*" "re-load generated corefile" | |
234 | + | |
235 | +gdb_test "frame" "#0 \[^\r\n\]* lib .*" "library got loaded" | |
236 | + | |
237 | +gdb_test "bt" | |
238 | +gdb_test "info shared" |