Coverage Report

Created: 2025-06-24 06:45

/src/binutils-gdb/bfd/corefile.c
Line
Count
Source (jump to first uncovered line)
1
/* Core file generic interface routines for BFD.
2
   Copyright (C) 1990-2025 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
0
{
53
0
  if (abfd->format != bfd_core)
54
0
    {
55
0
      bfd_set_error (bfd_error_invalid_operation);
56
0
      return NULL;
57
0
    }
58
0
  return BFD_SEND (abfd, _core_file_failing_command, (abfd));
59
0
}
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
0
{
76
0
  if (abfd->format != bfd_core)
77
0
    {
78
0
      bfd_set_error (bfd_error_invalid_operation);
79
0
      return 0;
80
0
    }
81
0
  return BFD_SEND (abfd, _core_file_failing_signal, (abfd));
82
0
}
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
0
{
100
0
  if (abfd->format != bfd_core)
101
0
    {
102
0
      bfd_set_error (bfd_error_invalid_operation);
103
0
      return 0;
104
0
    }
105
0
  return BFD_SEND (abfd, _core_file_pid, (abfd));
106
0
}
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
0
{
126
0
  if (core_bfd->format != bfd_core || exec_bfd->format != bfd_object)
127
0
    {
128
0
      bfd_set_error (bfd_error_wrong_format);
129
0
      return false;
130
0
    }
131
132
0
  return BFD_SEND (core_bfd, _core_file_matches_executable_p,
133
0
       (core_bfd, exec_bfd));
134
0
}
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
0
{
160
0
  const char *exec;
161
0
  const char *core;
162
0
  const char *last_slash;
163
164
0
  if (exec_bfd == NULL || core_bfd == NULL)
165
0
    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
0
  core = bfd_core_file_failing_command (core_bfd);
173
0
  if (core == NULL)
174
0
    return true;
175
176
0
  exec = bfd_get_filename (exec_bfd);
177
0
  if (exec == NULL)
178
0
    return true;
179
180
0
  last_slash = strrchr (core, '/');
181
0
  if (last_slash != NULL)
182
0
    core = last_slash + 1;
183
184
0
  last_slash = strrchr (exec, '/');
185
0
  if (last_slash != NULL)
186
0
    exec = last_slash + 1;
187
188
0
  return filename_cmp (exec, core) == 0;
189
0
}
190