(root)/
binutils-2.41/
bfd/
corefile.c
       1  /* Core file generic interface routines for BFD.
       2     Copyright (C) 1990-2023 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  	bool 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  bool
     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  	bool 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  bool
     158  generic_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
     159  {
     160    const char *exec;
     161    const char *core;
     162    const 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 = 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