1 /* Core file generic interface routines for BFD. 2 Copyright (C) 1990-2014 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