xref: /aosp_15_r20/external/cronet/base/debug/elf_reader.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_DEBUG_ELF_READER_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_DEBUG_ELF_READER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <elf.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <optional>
11*6777b538SAndroid Build Coastguard Worker #include <string_view>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/hash/sha1.h"
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker // Functions for querying metadata from ELF binaries. All functions are signal
18*6777b538SAndroid Build Coastguard Worker // safe and require that the file be fully memory mapped.
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker #if __SIZEOF_POINTER__ == 4
21*6777b538SAndroid Build Coastguard Worker using Phdr = Elf32_Phdr;
22*6777b538SAndroid Build Coastguard Worker #else
23*6777b538SAndroid Build Coastguard Worker using Phdr = Elf64_Phdr;
24*6777b538SAndroid Build Coastguard Worker #endif
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker namespace base {
27*6777b538SAndroid Build Coastguard Worker namespace debug {
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker // Hex-encodes the build ID from the ELF binary located at |elf_mapped_base|.
30*6777b538SAndroid Build Coastguard Worker // Returns the length of the build ID in bytes, or zero if the build ID couldn't
31*6777b538SAndroid Build Coastguard Worker // be read.
32*6777b538SAndroid Build Coastguard Worker // When |uppercase| is |true|, the output string is written using uppercase hex
33*6777b538SAndroid Build Coastguard Worker // characters. Otherwise, the output is lowercased.
34*6777b538SAndroid Build Coastguard Worker constexpr size_t kMaxBuildIdStringLength = kSHA1Length * 2;
35*6777b538SAndroid Build Coastguard Worker using ElfBuildIdBuffer = char[kMaxBuildIdStringLength + 1];
36*6777b538SAndroid Build Coastguard Worker size_t BASE_EXPORT ReadElfBuildId(const void* elf_mapped_base,
37*6777b538SAndroid Build Coastguard Worker                                   bool uppercase,
38*6777b538SAndroid Build Coastguard Worker                                   ElfBuildIdBuffer build_id);
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker // Returns the library name from the ELF file mapped at |elf_mapped_base|.
41*6777b538SAndroid Build Coastguard Worker // Returns an empty result if the name could not be read.
42*6777b538SAndroid Build Coastguard Worker std::optional<std::string_view> BASE_EXPORT
43*6777b538SAndroid Build Coastguard Worker ReadElfLibraryName(const void* elf_mapped_base);
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker // Returns a span of ELF program headers for the ELF file mapped at
46*6777b538SAndroid Build Coastguard Worker // |elf_mapped_base|, or an empty span if the header couldn't be read.
47*6777b538SAndroid Build Coastguard Worker span<const Phdr> BASE_EXPORT GetElfProgramHeaders(const void* elf_mapped_base);
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker // Returns the offset to add to virtual addresses in the image to compute the
50*6777b538SAndroid Build Coastguard Worker // mapped virtual address. This value must be added to the p_vaddr field in the
51*6777b538SAndroid Build Coastguard Worker // Phdrs to obtain the mapped virtual address.
52*6777b538SAndroid Build Coastguard Worker size_t BASE_EXPORT GetRelocationOffset(const void* elf_mapped_base);
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker }  // namespace debug
55*6777b538SAndroid Build Coastguard Worker }  // namespace base
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker #endif  // BASE_DEBUG_ELF_READER_H_
58