Go to file
Andrew Burgess a47a679c76 gdb/corefile: improve file backed mapping handling
This commit improves how GDB handles file backed mappings within a
core file, specifically, this is a restructuring of the function
core_target::build_file_mapping.

The primary motivation for this commit was to put in place the
infrastructure to support the next commit in this series, but this
commit does itself make some improvements.

Currently in core_target::build_file_mapping we use
gdbarch_read_core_file_mappings to iterate over the mapped regions
within a core file.

For each region a callback is invoked which is passed details of the
mapping; the file the mapping is from, the offset into the file, and
the address range at which the mapping exists.  We are also passed the
build-id for the mapped file in some cases.

We are only told the build-id for the mapped region which actually
contains the ELF header of the mapped file.  Other regions of the same
mapped ELF will not have the build-id passed to the callback.

Within core_target::build_file_mapping, in the per-region callback, we
try to find the mapped file based on its filename.  If the file can't
be found, and if we have a build-id then we'll ask debuginfod to
download the file.

However we find the file, we cache the opened bfd object, which is
good.  Subsequent mappings from the same file will not have a build-id
set, but by that point we already have a cached open bfd object, so
the lack of build-id is irrelevant.

The problem with the above is that if we find a matching file based on
the filename, then we accept that file, even if we have a build-id,
and the build-id doesn't match.

Currently, the mapped region processing is done in a single pass, we
call gdbarch_read_core_file_mappings, and for each mapping, as we see
it, we create the data structures needed to represent that mapping.

In this commit, I will change this to a two phase process.  In the
first phase the mappings are grouped together based on the name of the
mapped file.  At the end of phase one we have a 'struct mapped_file',
a new struct, for each mapped file.  This struct associates an
optional build-id with a list of mapped regions.

In the second phase we try to find the file using its filename.  If
the file is found, and the 'struct mapped_file' has a build-id, then
we'll compare the build-id with the file we found.  This allows us to
reject on-disk files which have changed since the core file was
created.

If no suitable file was found (either no file found, or a build-id
mismatch) then we can use debuginfod to potentially download a
suitable file.

  NOTE: In the future we could potentially add additional sanity
  checks here, for example, if a data-file is mapped, and has no
  build-id, we can estimate a minimum file size based on the expected
  mappings.  If the file we find is not big enough then we can reject
  the on-disk file.  But I don't know how useful this would actually
  be, so I've not done that for now.

Having found (or not) a suitable file then we can create the data
structures for each mapped region just as we did before.

The new functionality here is the extra build-id check, and the
possibility of rejecting an on-disk file if the build-id doesn't
match.

This change could have been done within the existing single phase
approach I think, however, in the next approach I need to have all the
mapped regions associated with the expected build-id, and the new two
phase structure allows me to do that, this is the reason for such an
extensive rewrite in this commit.

There's a new test that exercises GDB's ability to find mapped files
via the build-id, and this downloading from debuginfod.
2024-09-07 20:28:57 +01:00
bfd Not append rela for absolute symbol 2024-09-07 10:07:13 +08:00
binutils get_type_abbrev_from_form tidy 2024-08-29 21:05:57 +09:30
config Revert "Remove LIBINTL_DEP" 2024-06-20 21:15:27 +09:30
contrib Revert "contrib: Add autoregen.py" 2024-09-04 13:38:57 +00:00
cpu Add markers for 2.43 branch/release 2024-07-20 12:43:19 +01:00
elfcpp Add markers for 2.43 branch/release 2024-07-20 12:43:19 +01:00
etc Update year range in copyright notice of binutils files 2024-01-04 22:58:12 +10:30
gas Add macros to get opcode of instructions approriately 2024-09-07 10:06:03 +08:00
gdb gdb/corefile: improve file backed mapping handling 2024-09-07 20:28:57 +01:00
gdbserver gdbserver: aarch64: Fix expedited registers list 2024-09-05 01:02:51 -03:00
gdbsupport gdb: avoid '//' in filenames when searching for debuginfo 2024-08-19 15:02:56 +01:00
gnulib autoupdate: replace obsolete macros AC_CONFIG_HEADER 2024-06-10 08:25:55 +09:30
gold gold: Always resolve non-default weak undefined to 0 2024-08-31 04:28:43 -07:00
gprof Change version to 2.43.50 2024-07-20 13:16:33 +01:00
gprofng Rename gp-* man pages to gprofng-* man pages 2024-09-06 14:21:54 -07:00
include Add macros to get opcode of instructions approriately 2024-09-07 10:06:03 +08:00
ld Not append rela for absolute symbol 2024-09-07 10:07:13 +08:00
libbacktrace autoupdate: regen after replacing obsolete macros 2024-06-10 08:25:56 +09:30
libctf PR32093, -Walloc-size warning in ctf-hash.c 2024-08-29 21:05:57 +09:30
libdecnumber regen config 2023-08-12 10:27:57 +09:30
libiberty libiberty: sync with gcc 2024-09-04 15:35:42 +01:00
libsframe libsframe: remove runstatedir in Makefile.in 2024-07-10 10:24:45 +02:00
opcodes x86/APX: use D for 2-operand CFCMOVcc 2024-09-06 08:35:42 +02:00
readline autoupdate: add square brackets around arguments of AC_INIT 2024-06-10 08:25:56 +09:30
sim sim: pru: Fix test case assembly with latest GAS 2024-08-12 23:33:59 +03:00
texinfo
zlib autoupdate: regen after replacing obsolete macros 2024-06-10 08:25:56 +09:30
.cvsignore
.editorconfig Add top-level .editorconfig file 2022-01-28 08:25:42 -05:00
.gitattributes binutils-gdb/git: highlight whitespace errors in source files 2022-07-25 14:35:41 +01:00
.gitignore .gitignore: ignore .vscode 2024-05-30 12:09:35 +01:00
.pre-commit-config.yaml pre-commit: autoupdate 2024-08-12 13:07:59 -04:00
ar-lib
ChangeLog Add markers for 2.43 branch/release 2024-07-20 12:43:19 +01:00
compile
config-ml.in MSP430: Add -fno-exceptions multilib 2023-08-12 10:24:26 +09:30
config.guess Synchronize config.[sub|guess] with the latest versions from the config project. 2024-07-15 10:22:54 +01:00
config.rpath
config.sub Synchronize config.[sub|guess] with the latest versions from the config project. 2024-07-15 10:22:54 +01:00
configure Disable gprofng build for *musl* 2024-08-26 13:48:29 -07:00
configure.ac Disable gprofng build for *musl* 2024-08-26 13:48:29 -07:00
COPYING
COPYING3
COPYING3.LIB
COPYING.LIB
COPYING.LIBGLOSS
COPYING.NEWLIB
depcomp
djunpack.bat
install-sh
libtool.m4 FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts 2023-08-12 10:25:06 +09:30
lt~obsolete.m4
ltgcc.m4
ltmain.sh Do not use HAVE_DOS_BASED_FILE_SYSTEM for Cygwin. 2023-08-12 10:25:06 +09:30
ltoptions.m4
ltsugar.m4
ltversion.m4
MAINTAINERS Fix compiling bfd/vms-lib.c for a 32-bit host. 2024-03-18 10:26:16 +00:00
Makefile.def Revert "Pass GUILE down to subdirectories" 2024-03-22 11:07:28 -06:00
Makefile.in Revert "Pass GUILE down to subdirectories" 2024-03-22 11:07:28 -06:00
Makefile.tpl Revert "Pass GUILE down to subdirectories" 2024-03-22 11:07:28 -06:00
makefile.vms
missing
mkdep
mkinstalldirs
move-if-change
multilib.am
README
README-maintainer-mode Note that at least dejagnu version 1.5.3 is required in order to be ale to run the testsuites. 2022-10-04 10:54:19 +01:00
SECURITY.txt Add a SECURITY.txt file describing the GNU Binutils' project's stance on security related bugs. 2023-04-20 16:52:11 +01:00
setup.com
src-release.sh src-release.sh: don't take untracked files into account in the uncommitted changes check 2024-06-10 12:40:06 +01:00
symlink-tree
test-driver
ylwrap

		   README for GNU development tools

This directory contains various GNU compilers, assemblers, linkers, 
debuggers, etc., plus their support routines, definitions, and documentation.

If you are receiving this as part of a GDB release, see the file gdb/README.
If with a binutils release, see binutils/README;  if with a libg++ release,
see libg++/README, etc.  That'll give you info about this
package -- supported targets, how to use it, how to report bugs, etc.

It is now possible to automatically configure and build a variety of
tools with one command.  To build all of the tools contained herein,
run the ``configure'' script here, e.g.:

	./configure 
	make

To install them (by default in /usr/local/bin, /usr/local/lib, etc),
then do:
	make install

(If the configure script can't determine your type of computer, give it
the name as an argument, for instance ``./configure sun4''.  You can
use the script ``config.sub'' to test whether a name is recognized; if
it is, config.sub translates it to a triplet specifying CPU, vendor,
and OS.)

If you have more than one compiler on your system, it is often best to
explicitly set CC in the environment before running configure, and to
also set CC when running make.  For example (assuming sh/bash/ksh):

	CC=gcc ./configure
	make

A similar example using csh:

	setenv CC gcc
	./configure
	make

Much of the code and documentation enclosed is copyright by
the Free Software Foundation, Inc.  See the file COPYING or
COPYING.LIB in the various directories, for a description of the
GNU General Public License terms under which you can copy the files.

REPORTING BUGS: Again, see gdb/README, binutils/README, etc., for info
on where and how to report problems.