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