diff options
Diffstat (limited to 'bfd/corefile.c')
-rw-r--r-- | bfd/corefile.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/bfd/corefile.c b/bfd/corefile.c index adc5b4ac88..aaf888bcec 100644 --- a/bfd/corefile.c +++ b/bfd/corefile.c @@ -107,3 +107,59 @@ core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd) return BFD_SEND (core_bfd, _core_file_matches_executable_p, (core_bfd, exec_bfd)); } + +/* +FUNCTION + generic_core_file_matches_executable_p + +SYNOPSIS + bfd_boolean 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. +*/ + +bfd_boolean +generic_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd) +{ + char *exec; + char *core; + 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 = (char *) 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 strcmp (exec, core) == 0; +} + |