1 /* Core file generic interface routines for BFD.
2    Copyright (C) 1990-2016 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 {
53   if (abfd->format != bfd_core)
54     {
55       bfd_set_error (bfd_error_invalid_operation);
56       return NULL;
57     }
58   return BFD_SEND (abfd, _core_file_failing_command, (abfd));
59 }
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 {
76   if (abfd->format != bfd_core)
77     {
78       bfd_set_error (bfd_error_invalid_operation);
79       return 0;
80     }
81   return BFD_SEND (abfd, _core_file_failing_signal, (abfd));
82 }
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 {
100   if (abfd->format != bfd_core)
101     {
102       bfd_set_error (bfd_error_invalid_operation);
103       return 0;
104     }
105   return BFD_SEND (abfd, _core_file_pid, (abfd));
106 }
107 
108 
109 /*
110 FUNCTION
111 	core_file_matches_executable_p
112 
113 SYNOPSIS
114 	bfd_boolean 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 bfd_boolean
124 core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
125 {
126   if (core_bfd->format != bfd_core || exec_bfd->format != bfd_object)
127     {
128       bfd_set_error (bfd_error_wrong_format);
129       return FALSE;
130     }
131 
132   return BFD_SEND (core_bfd, _core_file_matches_executable_p,
133 		   (core_bfd, exec_bfd));
134 }
135 
136 /*
137 FUNCTION
138         generic_core_file_matches_executable_p
139 
140 SYNOPSIS
141         bfd_boolean 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 bfd_boolean
158 generic_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
159 {
160   char *exec;
161   char *core;
162   char *last_slash;
163 
164   if (exec_bfd == NULL || core_bfd == NULL)
165     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   core = (char *) bfd_core_file_failing_command (core_bfd);
173   if (core == NULL)
174     return TRUE;
175 
176   exec = bfd_get_filename (exec_bfd);
177   if (exec == NULL)
178     return TRUE;
179 
180   last_slash = strrchr (core, '/');
181   if (last_slash != NULL)
182     core = last_slash + 1;
183 
184   last_slash = strrchr (exec, '/');
185   if (last_slash != NULL)
186     exec = last_slash + 1;
187 
188   return filename_cmp (exec, core) == 0;
189 }
190 
191