@section Core files


@subsection Core file functions


@strong{Description}@*
These are functions pertaining to core files.

@findex bfd_core_file_failing_command
@subsubsection @code{bfd_core_file_failing_command}
@strong{Synopsis}
@example
const char *bfd_core_file_failing_command (bfd *abfd);
@end example
@strong{Description}@*
Return a read-only string explaining which program was running
when it failed and produced the core file @var{abfd}.

@findex bfd_core_file_failing_signal
@subsubsection @code{bfd_core_file_failing_signal}
@strong{Synopsis}
@example
int bfd_core_file_failing_signal (bfd *abfd);
@end example
@strong{Description}@*
Returns the signal number which caused the core dump which
generated the file the BFD @var{abfd} is attached to.

@findex bfd_core_file_pid
@subsubsection @code{bfd_core_file_pid}
@strong{Synopsis}
@example
int bfd_core_file_pid (bfd *abfd);
@end example
@strong{Description}@*
Returns the PID of the process the core dump the BFD
@var{abfd} is attached to was generated from.

@findex core_file_matches_executable_p
@subsubsection @code{core_file_matches_executable_p}
@strong{Synopsis}
@example
bfd_boolean core_file_matches_executable_p
   (bfd *core_bfd, bfd *exec_bfd);
@end example
@strong{Description}@*
Return @code{TRUE} if the core file attached to @var{core_bfd}
was generated by a run of the executable file attached to
@var{exec_bfd}, @code{FALSE} otherwise.

@findex generic_core_file_matches_executable_p
@subsubsection @code{generic_core_file_matches_executable_p}
@strong{Synopsis}
@example
bfd_boolean generic_core_file_matches_executable_p
   (bfd *core_bfd, bfd *exec_bfd);
@end example
@strong{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.

