/src/binutils-gdb/bfd/corefile.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* Core file generic interface routines for BFD. |
2 | | Copyright (C) 1990-2025 Free Software Foundation, Inc. |
3 | | Written by Cygnus Support. |
4 | | |
5 | | This file is part of BFD, the Binary File Descriptor library. |
6 | | |
7 | | This program is free software; you can redistribute it and/or modify |
8 | | it under the terms of the GNU General Public License as published by |
9 | | the Free Software Foundation; either version 3 of the License, or |
10 | | (at your option) any later version. |
11 | | |
12 | | This program is distributed in the hope that it will be useful, |
13 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | | GNU General Public License for more details. |
16 | | |
17 | | You should have received a copy of the GNU General Public License |
18 | | along with this program; if not, write to the Free Software |
19 | | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
20 | | MA 02110-1301, USA. */ |
21 | | |
22 | | /* |
23 | | SECTION |
24 | | Core files |
25 | | |
26 | | SUBSECTION |
27 | | Core file functions |
28 | | |
29 | | DESCRIPTION |
30 | | These are functions pertaining to core files. |
31 | | */ |
32 | | |
33 | | #include "sysdep.h" |
34 | | #include "bfd.h" |
35 | | #include "libbfd.h" |
36 | | |
37 | | /* |
38 | | FUNCTION |
39 | | bfd_core_file_failing_command |
40 | | |
41 | | SYNOPSIS |
42 | | const char *bfd_core_file_failing_command (bfd *abfd); |
43 | | |
44 | | DESCRIPTION |
45 | | Return a read-only string explaining which program was running |
46 | | when it failed and produced the core file @var{abfd}. |
47 | | |
48 | | */ |
49 | | |
50 | | const char * |
51 | | bfd_core_file_failing_command (bfd *abfd) |
52 | 0 | { |
53 | 0 | if (abfd->format != bfd_core) |
54 | 0 | { |
55 | 0 | bfd_set_error (bfd_error_invalid_operation); |
56 | 0 | return NULL; |
57 | 0 | } |
58 | 0 | return BFD_SEND (abfd, _core_file_failing_command, (abfd)); |
59 | 0 | } |
60 | | |
61 | | /* |
62 | | FUNCTION |
63 | | bfd_core_file_failing_signal |
64 | | |
65 | | SYNOPSIS |
66 | | int bfd_core_file_failing_signal (bfd *abfd); |
67 | | |
68 | | DESCRIPTION |
69 | | Returns the signal number which caused the core dump which |
70 | | generated the file the BFD @var{abfd} is attached to. |
71 | | */ |
72 | | |
73 | | int |
74 | | bfd_core_file_failing_signal (bfd *abfd) |
75 | 0 | { |
76 | 0 | if (abfd->format != bfd_core) |
77 | 0 | { |
78 | 0 | bfd_set_error (bfd_error_invalid_operation); |
79 | 0 | return 0; |
80 | 0 | } |
81 | 0 | return BFD_SEND (abfd, _core_file_failing_signal, (abfd)); |
82 | 0 | } |
83 | | |
84 | | /* |
85 | | FUNCTION |
86 | | bfd_core_file_pid |
87 | | |
88 | | SYNOPSIS |
89 | | int bfd_core_file_pid (bfd *abfd); |
90 | | |
91 | | DESCRIPTION |
92 | | |
93 | | Returns the PID of the process the core dump the BFD |
94 | | @var{abfd} is attached to was generated from. |
95 | | */ |
96 | | |
97 | | int |
98 | | bfd_core_file_pid (bfd *abfd) |
99 | 0 | { |
100 | 0 | if (abfd->format != bfd_core) |
101 | 0 | { |
102 | 0 | bfd_set_error (bfd_error_invalid_operation); |
103 | 0 | return 0; |
104 | 0 | } |
105 | 0 | return BFD_SEND (abfd, _core_file_pid, (abfd)); |
106 | 0 | } |
107 | | |
108 | | |
109 | | /* |
110 | | FUNCTION |
111 | | core_file_matches_executable_p |
112 | | |
113 | | SYNOPSIS |
114 | | bool core_file_matches_executable_p |
115 | | (bfd *core_bfd, bfd *exec_bfd); |
116 | | |
117 | | DESCRIPTION |
118 | | Return <<TRUE>> if the core file attached to @var{core_bfd} |
119 | | was generated by a run of the executable file attached to |
120 | | @var{exec_bfd}, <<FALSE>> otherwise. |
121 | | */ |
122 | | |
123 | | bool |
124 | | core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd) |
125 | 0 | { |
126 | 0 | if (core_bfd->format != bfd_core || exec_bfd->format != bfd_object) |
127 | 0 | { |
128 | 0 | bfd_set_error (bfd_error_wrong_format); |
129 | 0 | return false; |
130 | 0 | } |
131 | | |
132 | 0 | return BFD_SEND (core_bfd, _core_file_matches_executable_p, |
133 | 0 | (core_bfd, exec_bfd)); |
134 | 0 | } |
135 | | |
136 | | /* |
137 | | FUNCTION |
138 | | generic_core_file_matches_executable_p |
139 | | |
140 | | SYNOPSIS |
141 | | bool generic_core_file_matches_executable_p |
142 | | (bfd *core_bfd, bfd *exec_bfd); |
143 | | |
144 | | DESCRIPTION |
145 | | Return TRUE if the core file attached to @var{core_bfd} |
146 | | was generated by a run of the executable file attached |
147 | | to @var{exec_bfd}. The match is based on executable |
148 | | basenames only. |
149 | | |
150 | | Note: When not able to determine the core file failing |
151 | | command or the executable name, we still return TRUE even |
152 | | though we're not sure that core file and executable match. |
153 | | This is to avoid generating a false warning in situations |
154 | | where we really don't know whether they match or not. |
155 | | */ |
156 | | |
157 | | bool |
158 | | generic_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd) |
159 | 0 | { |
160 | 0 | const char *exec; |
161 | 0 | const char *core; |
162 | 0 | const char *last_slash; |
163 | |
|
164 | 0 | if (exec_bfd == NULL || core_bfd == NULL) |
165 | 0 | return true; |
166 | | |
167 | | /* The cast below is to avoid a compiler warning due to the assignment |
168 | | of the const char * returned by bfd_core_file_failing_command to a |
169 | | non-const char *. In this case, the assignement does not lead to |
170 | | breaking the const, as we're only reading the string. */ |
171 | | |
172 | 0 | core = bfd_core_file_failing_command (core_bfd); |
173 | 0 | if (core == NULL) |
174 | 0 | return true; |
175 | | |
176 | 0 | exec = bfd_get_filename (exec_bfd); |
177 | 0 | if (exec == NULL) |
178 | 0 | return true; |
179 | | |
180 | 0 | last_slash = strrchr (core, '/'); |
181 | 0 | if (last_slash != NULL) |
182 | 0 | core = last_slash + 1; |
183 | |
|
184 | 0 | last_slash = strrchr (exec, '/'); |
185 | 0 | if (last_slash != NULL) |
186 | 0 | exec = last_slash + 1; |
187 | |
|
188 | 0 | return filename_cmp (exec, core) == 0; |
189 | 0 | } |
190 | | |