1 /* ELF core file support for BFD.
2 Copyright (C) 1995-2021 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
22 elf_core_file_failing_command (bfd
*abfd
)
24 return elf_tdata (abfd
)->core
->command
;
28 elf_core_file_failing_signal (bfd
*abfd
)
30 return elf_tdata (abfd
)->core
->signal
;
34 elf_core_file_pid (bfd
*abfd
)
36 return elf_tdata (abfd
)->core
->pid
;
40 elf_core_file_matches_executable_p (bfd
*core_bfd
, bfd
*exec_bfd
)
44 /* xvecs must match if both are ELF files for the same target. */
46 if (core_bfd
->xvec
!= exec_bfd
->xvec
)
48 bfd_set_error (bfd_error_system_call
);
52 /* If both BFDs have identical build-ids, then they match. */
53 if (core_bfd
->build_id
!= NULL
54 && exec_bfd
->build_id
!= NULL
55 && core_bfd
->build_id
->size
== exec_bfd
->build_id
->size
56 && memcmp (core_bfd
->build_id
->data
, exec_bfd
->build_id
->data
,
57 core_bfd
->build_id
->size
) == 0)
60 /* See if the name in the corefile matches the executable name. */
61 corename
= elf_tdata (core_bfd
)->core
->program
;
64 const char* execname
= strrchr (bfd_get_filename (exec_bfd
), '/');
66 execname
= execname
? execname
+ 1 : bfd_get_filename (exec_bfd
);
68 if (strcmp (execname
, corename
) != 0)
75 /* Core files are simply standard ELF formatted files that partition
76 the file using the execution view of the file (program header table)
77 rather than the linking view. In fact, there is no section header
80 The process status information (including the contents of the general
81 register set) and the floating point register set are stored in a
82 segment of type PT_NOTE. We handcraft a couple of extra bfd sections
83 that allow standard bfd access to the general registers (.reg) and the
84 floating point registers (.reg2). */
87 elf_core_file_p (bfd
*abfd
)
89 Elf_External_Ehdr x_ehdr
; /* Elf file header, external form. */
90 Elf_Internal_Ehdr
*i_ehdrp
; /* Elf file header, internal form. */
91 Elf_Internal_Phdr
*i_phdrp
; /* Elf program header, internal form. */
93 const struct elf_backend_data
*ebd
;
97 /* Read in the ELF header in external format. */
98 if (bfd_bread (&x_ehdr
, sizeof (x_ehdr
), abfd
) != sizeof (x_ehdr
))
100 if (bfd_get_error () != bfd_error_system_call
)
106 /* Check the magic number. */
107 if (! elf_file_p (&x_ehdr
))
110 /* FIXME: Check EI_VERSION here ! */
112 /* Check the address size ("class"). */
113 if (x_ehdr
.e_ident
[EI_CLASS
] != ELFCLASS
)
116 /* Check the byteorder. */
117 switch (x_ehdr
.e_ident
[EI_DATA
])
119 case ELFDATA2MSB
: /* Big-endian. */
120 if (! bfd_big_endian (abfd
))
123 case ELFDATA2LSB
: /* Little-endian. */
124 if (! bfd_little_endian (abfd
))
131 /* Give abfd an elf_obj_tdata. */
132 if (! (*abfd
->xvec
->_bfd_set_format
[bfd_core
]) (abfd
))
135 /* Swap in the rest of the header, now that we have the byte order. */
136 i_ehdrp
= elf_elfheader (abfd
);
137 elf_swap_ehdr_in (abfd
, &x_ehdr
, i_ehdrp
);
140 elf_debug_file (i_ehdrp
);
143 ebd
= get_elf_backend_data (abfd
);
145 /* Check that the ELF e_machine field matches what this particular
146 BFD format expects. */
148 if (ebd
->elf_machine_code
!= i_ehdrp
->e_machine
149 && (ebd
->elf_machine_alt1
== 0
150 || i_ehdrp
->e_machine
!= ebd
->elf_machine_alt1
)
151 && (ebd
->elf_machine_alt2
== 0
152 || i_ehdrp
->e_machine
!= ebd
->elf_machine_alt2
))
154 const bfd_target
* const *target_ptr
;
156 if (ebd
->elf_machine_code
!= EM_NONE
)
159 /* This is the generic ELF target. Let it match any ELF target
160 for which we do not have a specific backend. */
162 for (target_ptr
= bfd_target_vector
; *target_ptr
!= NULL
; target_ptr
++)
164 const struct elf_backend_data
*back
;
166 if ((*target_ptr
)->flavour
!= bfd_target_elf_flavour
)
168 back
= xvec_get_elf_backend_data (*target_ptr
);
169 if (back
->s
->arch_size
!= ARCH_SIZE
)
171 if (back
->elf_machine_code
== i_ehdrp
->e_machine
172 || (back
->elf_machine_alt1
!= 0
173 && i_ehdrp
->e_machine
== back
->elf_machine_alt1
)
174 || (back
->elf_machine_alt2
!= 0
175 && i_ehdrp
->e_machine
== back
->elf_machine_alt2
))
177 /* target_ptr is an ELF backend which matches this
178 object file, so reject the generic ELF target. */
184 /* If there is no program header, or the type is not a core file, then
186 if (i_ehdrp
->e_phoff
== 0 || i_ehdrp
->e_type
!= ET_CORE
)
189 /* Does BFD's idea of the phdr size match the size
190 recorded in the file? */
191 if (i_ehdrp
->e_phentsize
!= sizeof (Elf_External_Phdr
))
194 /* If the program header count is PN_XNUM(0xffff), the actual
195 count is in the first section header. */
196 if (i_ehdrp
->e_shoff
!= 0 && i_ehdrp
->e_phnum
== PN_XNUM
)
198 Elf_External_Shdr x_shdr
;
199 Elf_Internal_Shdr i_shdr
;
200 file_ptr where
= (file_ptr
) i_ehdrp
->e_shoff
;
202 /* Seek to the section header table in the file. */
203 if (bfd_seek (abfd
, where
, SEEK_SET
) != 0)
206 /* Read the first section header at index 0, and convert to internal
208 if (bfd_bread (&x_shdr
, sizeof (x_shdr
), abfd
) != sizeof (x_shdr
))
210 elf_swap_shdr_in (abfd
, &x_shdr
, &i_shdr
);
212 if (i_shdr
.sh_info
!= 0)
214 i_ehdrp
->e_phnum
= i_shdr
.sh_info
;
215 if (i_ehdrp
->e_phnum
!= i_shdr
.sh_info
)
220 /* Sanity check that we can read all of the program headers.
221 It ought to be good enough to just read the last one. */
222 if (i_ehdrp
->e_phnum
> 1)
224 Elf_External_Phdr x_phdr
;
225 Elf_Internal_Phdr i_phdr
;
228 /* Check that we don't have a totally silly number of
230 if (i_ehdrp
->e_phnum
> (unsigned int) -1 / sizeof (x_phdr
)
231 || i_ehdrp
->e_phnum
> (unsigned int) -1 / sizeof (i_phdr
))
234 where
= (file_ptr
)(i_ehdrp
->e_phoff
+ (i_ehdrp
->e_phnum
- 1) * sizeof (x_phdr
));
235 if ((bfd_size_type
) where
<= i_ehdrp
->e_phoff
)
238 if (bfd_seek (abfd
, where
, SEEK_SET
) != 0)
240 if (bfd_bread (&x_phdr
, sizeof (x_phdr
), abfd
) != sizeof (x_phdr
))
244 /* Move to the start of the program headers. */
245 if (bfd_seek (abfd
, (file_ptr
) i_ehdrp
->e_phoff
, SEEK_SET
) != 0)
248 /* Allocate space for the program headers. */
249 amt
= sizeof (*i_phdrp
) * i_ehdrp
->e_phnum
;
250 i_phdrp
= (Elf_Internal_Phdr
*) bfd_alloc (abfd
, amt
);
254 elf_tdata (abfd
)->phdr
= i_phdrp
;
256 /* Read and convert to internal form. */
257 for (phindex
= 0; phindex
< i_ehdrp
->e_phnum
; ++phindex
)
259 Elf_External_Phdr x_phdr
;
261 if (bfd_bread (&x_phdr
, sizeof (x_phdr
), abfd
) != sizeof (x_phdr
))
264 elf_swap_phdr_in (abfd
, &x_phdr
, i_phdrp
+ phindex
);
267 /* Set the machine architecture. Do this before processing the
268 program headers since we need to know the architecture type
269 when processing the notes of some systems' core files. */
270 if (! bfd_default_set_arch_mach (abfd
, ebd
->arch
, 0)
271 /* It's OK if this fails for the generic target. */
272 && ebd
->elf_machine_code
!= EM_NONE
)
275 /* Let the backend double check the format and override global
276 information. We do this before processing the program headers
277 to allow the correct machine (as opposed to just the default
278 machine) to be set, making it possible for grok_prstatus and
279 grok_psinfo to rely on the mach setting. */
280 if (ebd
->elf_backend_object_p
!= NULL
281 && ! ebd
->elf_backend_object_p (abfd
))
284 /* Process each program header. */
285 for (phindex
= 0; phindex
< i_ehdrp
->e_phnum
; ++phindex
)
286 if (! bfd_section_from_phdr (abfd
, i_phdrp
+ phindex
, (int) phindex
))
289 /* Check for core truncation. */
290 filesize
= bfd_get_file_size (abfd
);
293 for (phindex
= 0; phindex
< i_ehdrp
->e_phnum
; ++phindex
)
295 Elf_Internal_Phdr
*p
= i_phdrp
+ phindex
;
297 && (p
->p_offset
>= filesize
298 || p
->p_filesz
> filesize
- p
->p_offset
))
300 _bfd_error_handler (_("warning: %pB has a segment "
301 "extending past end of file"), abfd
);
308 /* Save the entry point from the ELF header. */
309 abfd
->start_address
= i_ehdrp
->e_entry
;
310 return _bfd_no_cleanup
;
313 bfd_set_error (bfd_error_wrong_format
);
318 /* Attempt to find a build-id in a core file from the core file BFD.
319 OFFSET is the file offset to a PT_LOAD segment that may contain
320 the build-id note. Returns TRUE upon success, FALSE otherwise. */
323 NAME(_bfd_elf
, core_find_build_id
)
327 Elf_External_Ehdr x_ehdr
; /* Elf file header, external form. */
328 Elf_Internal_Ehdr i_ehdr
; /* Elf file header, internal form. */
329 Elf_Internal_Phdr
*i_phdr
;
333 /* Seek to the position of the segment at OFFSET. */
334 if (bfd_seek (abfd
, offset
, SEEK_SET
) != 0)
337 /* Read in the ELF header in external format. */
338 if (bfd_bread (&x_ehdr
, sizeof (x_ehdr
), abfd
) != sizeof (x_ehdr
))
340 if (bfd_get_error () != bfd_error_system_call
)
346 /* Now check to see if we have a valid ELF file, and one that BFD can
347 make use of. The magic number must match, the address size ('class')
348 and byte-swapping must match our XVEC entry, and it must have a
349 section header table (FIXME: See comments re sections at top of this
351 if (! elf_file_p (&x_ehdr
)
352 || x_ehdr
.e_ident
[EI_VERSION
] != EV_CURRENT
353 || x_ehdr
.e_ident
[EI_CLASS
] != ELFCLASS
)
356 /* Check that file's byte order matches xvec's. */
357 switch (x_ehdr
.e_ident
[EI_DATA
])
359 case ELFDATA2MSB
: /* Big-endian. */
360 if (! bfd_header_big_endian (abfd
))
363 case ELFDATA2LSB
: /* Little-endian. */
364 if (! bfd_header_little_endian (abfd
))
367 case ELFDATANONE
: /* No data encoding specified. */
368 default: /* Unknown data encoding specified . */
372 elf_swap_ehdr_in (abfd
, &x_ehdr
, &i_ehdr
);
374 elf_debug_file (&i_ehdr
);
377 if (i_ehdr
.e_phentsize
!= sizeof (Elf_External_Phdr
) || i_ehdr
.e_phnum
== 0)
380 /* Read in program headers. */
381 if (_bfd_mul_overflow (i_ehdr
.e_phnum
, sizeof (*i_phdr
), &amt
))
383 bfd_set_error (bfd_error_file_too_big
);
386 i_phdr
= (Elf_Internal_Phdr
*) bfd_alloc (abfd
, amt
);
390 if (bfd_seek (abfd
, (file_ptr
) (offset
+ i_ehdr
.e_phoff
), SEEK_SET
) != 0)
393 /* Read in program headers and parse notes. */
394 for (i
= 0; i
< i_ehdr
.e_phnum
; ++i
, ++i_phdr
)
396 Elf_External_Phdr x_phdr
;
398 if (bfd_bread (&x_phdr
, sizeof (x_phdr
), abfd
) != sizeof (x_phdr
))
400 elf_swap_phdr_in (abfd
, &x_phdr
, i_phdr
);
402 if (i_phdr
->p_type
== PT_NOTE
&& i_phdr
->p_filesz
> 0)
404 elf_read_notes (abfd
, offset
+ i_phdr
->p_offset
,
405 i_phdr
->p_filesz
, i_phdr
->p_align
);
407 /* Make sure ABFD returns to processing the program headers. */
408 if (bfd_seek (abfd
, (file_ptr
) (offset
+ i_ehdr
.e_phoff
409 + (i
+ 1) * sizeof (x_phdr
)),
413 if (abfd
->build_id
!= NULL
)
418 /* Having gotten this far, we have a valid ELF section, but no
419 build-id was found. */
423 bfd_set_error (bfd_error_wrong_format
);