/* build-id-related functions.
- Copyright (C) 1991-2019 Free Software Foundation, Inc.
+ Copyright (C) 1991-2021 Free Software Foundation, Inc.
This file is part of GDB.
const struct bfd_build_id *
build_id_bfd_get (bfd *abfd)
{
- if (!bfd_check_format (abfd, bfd_object))
+ if (!bfd_check_format (abfd, bfd_object)
+ && !bfd_check_format (abfd, bfd_core))
return NULL;
if (abfd->build_id != NULL)
warning (_("File \"%s\" has no build-id, file skipped"),
bfd_get_filename (abfd));
else if (found->size != check_len
- || memcmp (found->data, check, found->size) != 0)
+ || memcmp (found->data, check, found->size) != 0)
warning (_("File \"%s\" has a different build-id, file skipped"),
bfd_get_filename (abfd));
else
}
/* We expect to be silent on the non-existing files. */
- gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename.get (), gnutarget, -1);
+ gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename.get (), gnutarget);
if (debug_bfd == NULL)
{
return debug_bfd;
}
-/* See build-id.h. */
+/* Common code for finding BFDs of a given build-id. This function
+ works with both debuginfo files (SUFFIX == ".debug") and executable
+ files (SUFFIX == ""). */
-gdb_bfd_ref_ptr
-build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id)
+static gdb_bfd_ref_ptr
+build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
+ const char *suffix)
{
/* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
cause "/.build-id/..." lookups. */
/* Compute where the file named after the build-id would be.
If debugdir is "/usr/lib/debug" and the build-id is abcdef, this will
- give "/usr/lib/debug/.build-id/ab/cdef.debug". */
+ give "/usr/lib/debug/.build-id/ab/cdef.debug". */
std::string link = debugdir.get ();
link += "/.build-id/";
while (size-- > 0)
string_appendf (link, "%02x", (unsigned) *data++);
- link += ".debug";
+ link += suffix;
gdb_bfd_ref_ptr debug_bfd
= build_id_to_debug_bfd_1 (link, build_id_len, build_id);
return debug_bfd;
/* Try to look under the sysroot as well. If the sysroot is
- "/the/sysroot", it will give
- "/the/sysroot/usr/lib/debug/.build-id/ab/cdef.debug".
+ "/the/sysroot", it will give
+ "/the/sysroot/usr/lib/debug/.build-id/ab/cdef.debug".
- Don't do it if the sysroot is the target system ("target:"). It
- could work in theory, but the lrealpath in build_id_to_debug_bfd_1
- only works with local paths. */
+ Don't do it if the sysroot is the target system ("target:"). It
+ could work in theory, but the lrealpath in build_id_to_debug_bfd_1
+ only works with local paths. */
if (strcmp (gdb_sysroot, TARGET_SYSROOT_PREFIX) != 0)
{
link = gdb_sysroot + link;
/* See build-id.h. */
+gdb_bfd_ref_ptr
+build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id)
+{
+ return build_id_to_bfd_suffix (build_id_len, build_id, ".debug");
+}
+
+/* See build-id.h. */
+
+gdb_bfd_ref_ptr
+build_id_to_exec_bfd (size_t build_id_len, const bfd_byte *build_id)
+{
+ return build_id_to_bfd_suffix (build_id_len, build_id, "");
+}
+
+/* See build-id.h. */
+
std::string
find_separate_debug_file_by_buildid (struct objfile *objfile)
{