Subversion Repositories Kolibri OS

Rev

Rev 5197 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* Core file generic interface routines for BFD.
  2.    Copyright (C) 1990-2015 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.