| /* Core file generic interface routines for BFD. | |
| Copyright (C) 1990-2023 Free Software Foundation, Inc. | |
| Written by Cygnus Support. | |
| This file is part of BFD, the Binary File Descriptor library. | |
| This program is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 3 of the License, or | |
| (at your option) any later version. | |
| This program is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with this program; if not, write to the Free Software | |
| Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | |
| MA 02110-1301, USA. */ | |
| /* | |
| SECTION | |
| Core files | |
| SUBSECTION | |
| Core file functions | |
| DESCRIPTION | |
| These are functions pertaining to core files. | |
| */ | |
| #include "sysdep.h" | |
| #include "bfd.h" | |
| #include "libbfd.h" | |
| /* | |
| FUNCTION | |
| bfd_core_file_failing_command | |
| SYNOPSIS | |
| const char *bfd_core_file_failing_command (bfd *abfd); | |
| DESCRIPTION | |
| Return a read-only string explaining which program was running | |
| when it failed and produced the core file @var{abfd}. | |
| */ | |
| const char * | |
| bfd_core_file_failing_command (bfd *abfd) | |
| { | |
| if (abfd->format != bfd_core) | |
| { | |
| bfd_set_error (bfd_error_invalid_operation); | |
| return NULL; | |
| } | |
| return BFD_SEND (abfd, _core_file_failing_command, (abfd)); | |
| } | |
| /* | |
| FUNCTION | |
| bfd_core_file_failing_signal | |
| SYNOPSIS | |
| int bfd_core_file_failing_signal (bfd *abfd); | |
| DESCRIPTION | |
| Returns the signal number which caused the core dump which | |
| generated the file the BFD @var{abfd} is attached to. | |
| */ | |
| int | |
| bfd_core_file_failing_signal (bfd *abfd) | |
| { | |
| if (abfd->format != bfd_core) | |
| { | |
| bfd_set_error (bfd_error_invalid_operation); | |
| return 0; | |
| } | |
| return BFD_SEND (abfd, _core_file_failing_signal, (abfd)); | |
| } | |
| /* | |
| FUNCTION | |
| bfd_core_file_pid | |
| SYNOPSIS | |
| int bfd_core_file_pid (bfd *abfd); | |
| DESCRIPTION | |
| Returns the PID of the process the core dump the BFD | |
| @var{abfd} is attached to was generated from. | |
| */ | |
| int | |
| bfd_core_file_pid (bfd *abfd) | |
| { | |
| if (abfd->format != bfd_core) | |
| { | |
| bfd_set_error (bfd_error_invalid_operation); | |
| return 0; | |
| } | |
| return BFD_SEND (abfd, _core_file_pid, (abfd)); | |
| } | |
| /* | |
| FUNCTION | |
| core_file_matches_executable_p | |
| SYNOPSIS | |
| bool core_file_matches_executable_p | |
| (bfd *core_bfd, bfd *exec_bfd); | |
| DESCRIPTION | |
| Return <<TRUE>> if the core file attached to @var{core_bfd} | |
| was generated by a run of the executable file attached to | |
| @var{exec_bfd}, <<FALSE>> otherwise. | |
| */ | |
| bool | |
| core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd) | |
| { | |
| if (core_bfd->format != bfd_core || exec_bfd->format != bfd_object) | |
| { | |
| bfd_set_error (bfd_error_wrong_format); | |
| return false; | |
| } | |
| return BFD_SEND (core_bfd, _core_file_matches_executable_p, | |
| (core_bfd, exec_bfd)); | |
| } | |
| /* | |
| FUNCTION | |
| generic_core_file_matches_executable_p | |
| SYNOPSIS | |
| bool generic_core_file_matches_executable_p | |
| (bfd *core_bfd, bfd *exec_bfd); | |
| DESCRIPTION | |
| Return TRUE if the core file attached to @var{core_bfd} | |
| was generated by a run of the executable file attached | |
| to @var{exec_bfd}. The match is based on executable | |
| basenames only. | |
| Note: When not able to determine the core file failing | |
| command or the executable name, we still return TRUE even | |
| though we're not sure that core file and executable match. | |
| This is to avoid generating a false warning in situations | |
| where we really don't know whether they match or not. | |
| */ | |
| bool | |
| generic_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd) | |
| { | |
| const char *exec; | |
| const char *core; | |
| const char *last_slash; | |
| if (exec_bfd == NULL || core_bfd == NULL) | |
| return true; | |
| /* The cast below is to avoid a compiler warning due to the assignment | |
| of the const char * returned by bfd_core_file_failing_command to a | |
| non-const char *. In this case, the assignement does not lead to | |
| breaking the const, as we're only reading the string. */ | |
| core = bfd_core_file_failing_command (core_bfd); | |
| if (core == NULL) | |
| return true; | |
| exec = bfd_get_filename (exec_bfd); | |
| if (exec == NULL) | |
| return true; | |
| last_slash = strrchr (core, '/'); | |
| if (last_slash != NULL) | |
| core = last_slash + 1; | |
| last_slash = strrchr (exec, '/'); | |
| if (last_slash != NULL) | |
| exec = last_slash + 1; | |
| return filename_cmp (exec, core) == 0; | |
| } | |