xref: /dragonfly/contrib/gdb-7/bfd/corefile.c (revision 1b722dce)
1 /* Core file generic interface routines for BFD.
2    Copyright 1990, 1991, 1992, 1993, 1994, 2000, 2001, 2002, 2003, 2005,
3    2007 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 3 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,
21    MA 02110-1301, USA.  */
22 
23 /*
24 SECTION
25 	Core files
26 
27 SUBSECTION
28 	Core file functions
29 
30 DESCRIPTION
31 	These are functions pertaining to core files.
32 */
33 
34 #include "sysdep.h"
35 #include "bfd.h"
36 #include "libbfd.h"
37 
38 /*
39 FUNCTION
40 	bfd_core_file_failing_command
41 
42 SYNOPSIS
43 	const char *bfd_core_file_failing_command (bfd *abfd);
44 
45 DESCRIPTION
46 	Return a read-only string explaining which program was running
47 	when it failed and produced the core file @var{abfd}.
48 
49 */
50 
51 const char *
52 bfd_core_file_failing_command (bfd *abfd)
53 {
54   if (abfd->format != bfd_core)
55     {
56       bfd_set_error (bfd_error_invalid_operation);
57       return NULL;
58     }
59   return BFD_SEND (abfd, _core_file_failing_command, (abfd));
60 }
61 
62 /*
63 FUNCTION
64 	bfd_core_file_failing_signal
65 
66 SYNOPSIS
67 	int bfd_core_file_failing_signal (bfd *abfd);
68 
69 DESCRIPTION
70 	Returns the signal number which caused the core dump which
71 	generated the file the BFD @var{abfd} is attached to.
72 */
73 
74 int
75 bfd_core_file_failing_signal (bfd *abfd)
76 {
77   if (abfd->format != bfd_core)
78     {
79       bfd_set_error (bfd_error_invalid_operation);
80       return 0;
81     }
82   return BFD_SEND (abfd, _core_file_failing_signal, (abfd));
83 }
84 
85 /*
86 FUNCTION
87 	core_file_matches_executable_p
88 
89 SYNOPSIS
90 	bfd_boolean core_file_matches_executable_p
91 	  (bfd *core_bfd, bfd *exec_bfd);
92 
93 DESCRIPTION
94 	Return <<TRUE>> if the core file attached to @var{core_bfd}
95 	was generated by a run of the executable file attached to
96 	@var{exec_bfd}, <<FALSE>> otherwise.
97 */
98 
99 bfd_boolean
100 core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
101 {
102   if (core_bfd->format != bfd_core || exec_bfd->format != bfd_object)
103     {
104       bfd_set_error (bfd_error_wrong_format);
105       return FALSE;
106     }
107 
108   return BFD_SEND (core_bfd, _core_file_matches_executable_p,
109 		   (core_bfd, exec_bfd));
110 }
111 
112 /*
113 FUNCTION
114         generic_core_file_matches_executable_p
115 
116 SYNOPSIS
117         bfd_boolean generic_core_file_matches_executable_p
118           (bfd *core_bfd, bfd *exec_bfd);
119 
120 DESCRIPTION
121         Return TRUE if the core file attached to @var{core_bfd}
122         was generated by a run of the executable file attached
123         to @var{exec_bfd}.  The match is based on executable
124         basenames only.
125 
126         Note: When not able to determine the core file failing
127         command or the executable name, we still return TRUE even
128         though we're not sure that core file and executable match.
129         This is to avoid generating a false warning in situations
130         where we really don't know whether they match or not.
131 */
132 
133 bfd_boolean
134 generic_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
135 {
136   char *exec;
137   char *core;
138   char *last_slash;
139 
140   if (exec_bfd == NULL || core_bfd == NULL)
141     return TRUE;
142 
143   /* The cast below is to avoid a compiler warning due to the assignment
144      of the const char * returned by bfd_core_file_failing_command to a
145      non-const char *.  In this case, the assignement does not lead to
146      breaking the const, as we're only reading the string.  */
147 
148   core = (char *) bfd_core_file_failing_command (core_bfd);
149   if (core == NULL)
150     return TRUE;
151 
152   exec = bfd_get_filename (exec_bfd);
153   if (exec == NULL)
154     return TRUE;
155 
156   last_slash = strrchr (core, '/');
157   if (last_slash != NULL)
158     core = last_slash + 1;
159 
160   last_slash = strrchr (exec, '/');
161   if (last_slash != NULL)
162     exec = last_slash + 1;
163 
164   return strcmp (exec, core) == 0;
165 }
166 
167