diff options
Diffstat (limited to 'simpleperf/read_elf.h')
-rw-r--r-- | simpleperf/read_elf.h | 82 |
1 files changed, 38 insertions, 44 deletions
diff --git a/simpleperf/read_elf.h b/simpleperf/read_elf.h index 3ade27fa..f289ee17 100644 --- a/simpleperf/read_elf.h +++ b/simpleperf/read_elf.h @@ -22,17 +22,11 @@ #include <string> #include "build_id.h" -namespace llvm { -class MemoryBuffer; -} - -namespace simpleperf { - // Read ELF functions are called in different situations, so it is hard to // decide whether to report error or not. So read ELF functions don't report // error when something wrong happens, instead they return ElfStatus, which // identifies different errors met while reading elf file. -enum class ElfStatus { +enum ElfStatus { NO_ERROR, FILE_NOT_FOUND, READ_FAILED, @@ -46,6 +40,9 @@ enum class ElfStatus { std::ostream& operator<<(std::ostream& os, const ElfStatus& status); ElfStatus GetBuildIdFromNoteFile(const std::string& filename, BuildId* build_id); +ElfStatus GetBuildIdFromElfFile(const std::string& filename, BuildId* build_id); +ElfStatus GetBuildIdFromEmbeddedElfFile(const std::string& filename, uint64_t file_offset, + uint32_t file_size, BuildId* build_id); // The symbol prefix used to indicate that the symbol belongs to android linker. static const std::string linker_prefix = "__dl_"; @@ -58,60 +55,57 @@ struct ElfFileSymbol { bool is_in_text_section; std::string name; - ElfFileSymbol() : vaddr(0), len(0), is_func(false), is_label(false), is_in_text_section(false) {} + ElfFileSymbol() : vaddr(0), len(0), is_func(false), is_label(false), is_in_text_section(false) { + } }; -struct ElfSegment { - uint64_t vaddr = 0; - uint64_t file_offset = 0; - uint64_t file_size = 0; - bool is_executable = false; - bool is_load = false; -}; +ElfStatus ParseSymbolsFromElfFile(const std::string& filename, + const BuildId& expected_build_id, + const std::function<void(const ElfFileSymbol&)>& callback); +ElfStatus ParseSymbolsFromEmbeddedElfFile(const std::string& filename, uint64_t file_offset, + uint32_t file_size, const BuildId& expected_build_id, + const std::function<void(const ElfFileSymbol&)>& callback); +ElfStatus ParseSymbolsFromElfFileInMemory(const char* data, size_t size, + const std::function<void(const ElfFileSymbol&)>& callback); +ElfStatus ParseDynamicSymbolsFromElfFile(const std::string& filename, + const std::function<void(const ElfFileSymbol&)>& callback); + +ElfStatus ReadMinExecutableVirtualAddressFromElfFile(const std::string& filename, + const BuildId& expected_build_id, + uint64_t* min_addr, + uint64_t* file_offset_of_min_vaddr); +ElfStatus ReadMinExecutableVirtualAddressFromEmbeddedElfFile(const std::string& filename, + uint64_t file_offset, + uint32_t file_size, + const BuildId& expected_build_id, + uint64_t* min_vaddr, + uint64_t* file_offset_of_min_vaddr); + +ElfStatus ReadSectionFromElfFile(const std::string& filename, const std::string& section_name, + std::string* content); -struct ElfSection { - std::string name; - uint64_t vaddr = 0; - uint64_t file_offset = 0; - uint64_t size = 0; -}; +namespace llvm { +class MemoryBuffer; +} + +namespace simpleperf { class ElfFile { public: - // Report error instead of returning status. - static std::unique_ptr<ElfFile> Open(const std::string& filename); - static std::unique_ptr<ElfFile> Open(const std::string& filename, ElfStatus* status) { - return Open(filename, nullptr, status); - } - - static std::unique_ptr<ElfFile> Open(const std::string& filename, - const BuildId* expected_build_id, ElfStatus* status); - static std::unique_ptr<ElfFile> Open(const char* data, size_t size, ElfStatus* status); + static std::unique_ptr<ElfFile> Open(const std::string& filename, ElfStatus* status); virtual ~ElfFile() {} - virtual bool Is64Bit() = 0; virtual llvm::MemoryBuffer* GetMemoryBuffer() = 0; - virtual std::vector<ElfSegment> GetProgramHeader() = 0; - virtual std::vector<ElfSection> GetSectionHeader() = 0; - virtual ElfStatus GetBuildId(BuildId* build_id) = 0; - - using ParseSymbolCallback = std::function<void(const ElfFileSymbol&)>; - virtual ElfStatus ParseSymbols(const ParseSymbolCallback& callback) = 0; - virtual void ParseDynamicSymbols(const ParseSymbolCallback& callback) = 0; - - virtual ElfStatus ReadSection(const std::string& section_name, std::string* content) = 0; - virtual uint64_t ReadMinExecutableVaddr(uint64_t* file_offset_of_min_vaddr) = 0; - virtual bool VaddrToOff(uint64_t vaddr, uint64_t* file_offset) = 0; protected: ElfFile() {} }; +} // namespace simpleperf + bool IsArmMappingSymbol(const char* name); ElfStatus IsValidElfFile(int fd, uint64_t file_offset = 0); bool IsValidElfFileMagic(const char* buf, size_t buf_size); bool GetBuildIdFromNoteSection(const char* section, size_t section_size, BuildId* build_id); -} // namespace simpleperf - #endif // SIMPLE_PERF_READ_ELF_H_ |