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