1 /* Core file generic interface routines for BFD.
2    Copyright 1990, 1991, 1992, 1993, 1994, 2000, 2001, 2002, 2003, 2005
3    Free Software Foundation, Inc.
4    Written by Cygnus Support.
5 
6 This file is part of BFD, the Binary File Descriptor library.
7 
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12 
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 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 "bfd.h"
34 #include "sysdep.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 	core_file_matches_executable_p
87 
88 SYNOPSIS
89 	bfd_boolean core_file_matches_executable_p
90 	  (bfd *core_bfd, bfd *exec_bfd);
91 
92 DESCRIPTION
93 	Return <<TRUE>> if the core file attached to @var{core_bfd}
94 	was generated by a run of the executable file attached to
95 	@var{exec_bfd}, <<FALSE>> otherwise.
96 */
97 
98 bfd_boolean
99 core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
100 {
101   if (core_bfd->format != bfd_core || exec_bfd->format != bfd_object)
102     {
103       bfd_set_error (bfd_error_wrong_format);
104       return FALSE;
105     }
106 
107   return BFD_SEND (core_bfd, _core_file_matches_executable_p,
108 		   (core_bfd, exec_bfd));
109 }
110 
111 /*
112 FUNCTION
113         generic_core_file_matches_executable_p
114 
115 SYNOPSIS
116         bfd_boolean generic_core_file_matches_executable_p
117           (bfd *core_bfd, bfd *exec_bfd);
118 
119 DESCRIPTION
120         Return TRUE if the core file attached to @var{core_bfd}
121         was generated by a run of the executable file attached
122         to @var{exec_bfd}.  The match is based on executable
123         basenames only.
124 
125         Note: When not able to determine the core file failing
126         command or the executable name, we still return TRUE even
127         though we're not sure that core file and executable match.
128         This is to avoid generating a false warning in situations
129         where we really don't know whether they match or not.
130 */
131 
132 bfd_boolean
133 generic_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
134 {
135   char *exec;
136   char *core;
137   char *last_slash;
138 
139   if (exec_bfd == NULL || core_bfd == NULL)
140     return TRUE;
141 
142   /* The cast below is to avoid a compiler warning due to the assignment
143      of the const char * returned by bfd_core_file_failing_command to a
144      non-const char *.  In this case, the assignement does not lead to
145      breaking the const, as we're only reading the string.  */
146 
147   core = (char *) bfd_core_file_failing_command (core_bfd);
148   if (core == NULL)
149     return TRUE;
150 
151   exec = bfd_get_filename (exec_bfd);
152   if (exec == NULL)
153     return TRUE;
154 
155   last_slash = strrchr (core, '/');
156   if (last_slash != NULL)
157     core = last_slash + 1;
158 
159   last_slash = strrchr (exec, '/');
160   if (last_slash != NULL)
161     exec = last_slash + 1;
162 
163   return strcmp (exec, core) == 0;
164 }
165 
166