Home | History | Annotate | Download | only in bfd
      1 /* Core file generic interface routines for BFD.
      2    Copyright (C) 1990-2016 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