mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
cb1a6b85b8
Add two versions of a new function build_id_equal which can be used to compare build-ids, then make use of these functions in GDB. It seems better to have a specific function for the task of comparing build-ids rather than having a length check followed by a memcmp call. There should be no user visible changes after this commit. Approved-By: Tom Tromey <tom@tromey.com>
100 lines
3.3 KiB
C++
100 lines
3.3 KiB
C++
/* build-id-related functions.
|
|
|
|
Copyright (C) 1991-2024 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef BUILD_ID_H
|
|
#define BUILD_ID_H
|
|
|
|
#include "gdb_bfd.h"
|
|
#include "gdbsupport/rsp-low.h"
|
|
|
|
/* Locate NT_GNU_BUILD_ID from ABFD and return its content. */
|
|
|
|
extern const struct bfd_build_id *build_id_bfd_get (bfd *abfd);
|
|
|
|
/* Return true if ABFD has NT_GNU_BUILD_ID matching the CHECK value.
|
|
Otherwise, issue a warning and return false. */
|
|
|
|
extern int build_id_verify (bfd *abfd,
|
|
size_t check_len, const bfd_byte *check);
|
|
|
|
|
|
/* Find and open a BFD for a debuginfo file given a build-id. If no BFD
|
|
can be found, return NULL. */
|
|
|
|
extern gdb_bfd_ref_ptr build_id_to_debug_bfd (size_t build_id_len,
|
|
const bfd_byte *build_id);
|
|
|
|
/* Find and open a BFD for an executable file given a build-id. If no BFD
|
|
can be found, return NULL. The returned reference to the BFD must be
|
|
released by the caller. */
|
|
|
|
extern gdb_bfd_ref_ptr build_id_to_exec_bfd (size_t build_id_len,
|
|
const bfd_byte *build_id);
|
|
|
|
/* Find the separate debug file for OBJFILE, by using the build-id
|
|
associated with OBJFILE's BFD. If successful, returns the file name for the
|
|
separate debug file, otherwise, return an empty string.
|
|
|
|
Any warnings that are generated by the lookup process should be added to
|
|
WARNINGS. If some other mechanism can be used to lookup the debug
|
|
information then the warning will not be shown, however, if GDB fails to
|
|
find suitable debug information using any approach, then any warnings
|
|
will be printed. */
|
|
|
|
extern std::string find_separate_debug_file_by_buildid
|
|
(struct objfile *objfile, deferred_warnings *warnings);
|
|
|
|
/* Return an hex-string representation of BUILD_ID. */
|
|
|
|
static inline std::string
|
|
build_id_to_string (const bfd_build_id *build_id)
|
|
{
|
|
gdb_assert (build_id != NULL);
|
|
|
|
return bin2hex (build_id->data, build_id->size);
|
|
}
|
|
|
|
/* Compare the content of two build-ids. One build-id (A) is passed as a
|
|
build-id pointer, while the second is passed using BUILD_ID_LEN and
|
|
BUILD_ID_DATA. Return true if the build-ids match, otherwise false. */
|
|
|
|
static inline bool
|
|
build_id_equal (const bfd_build_id *a, const bfd_size_type build_id_len,
|
|
const bfd_byte *build_id_data)
|
|
{
|
|
gdb_assert (a != nullptr);
|
|
gdb_assert (build_id_data != nullptr);
|
|
|
|
return (a->size == build_id_len
|
|
&& memcmp (a->data, build_id_data, a->size) == 0);
|
|
}
|
|
|
|
/* Like the above, but take two build-id pointers A and B. */
|
|
|
|
static inline bool
|
|
build_id_equal (const bfd_build_id *a, const bfd_build_id *b)
|
|
{
|
|
gdb_assert (a != nullptr);
|
|
gdb_assert (b != nullptr);
|
|
|
|
return build_id_equal (a, b->size, b->data);
|
|
}
|
|
|
|
#endif /* BUILD_ID_H */
|