| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
|
|
| #ifndef ABSL_DEBUGGING_INTERNAL_ELF_MEM_IMAGE_H_ |
| #define ABSL_DEBUGGING_INTERNAL_ELF_MEM_IMAGE_H_ |
|
|
| |
| |
| #include <climits> |
|
|
| #include "absl/base/config.h" |
|
|
| |
| |
| #ifdef ABSL_HAVE_ELF_MEM_IMAGE |
| #error ABSL_HAVE_ELF_MEM_IMAGE cannot be directly set |
| #endif |
|
|
| #if defined(__ELF__) && !defined(__OpenBSD__) && !defined(__QNX__) && \ |
| !defined(__native_client__) && !defined(__asmjs__) && \ |
| !defined(__wasm__) && !defined(__HAIKU__) && !defined(__sun) && \ |
| !defined(__VXWORKS__) && !defined(__hexagon__) |
| #define ABSL_HAVE_ELF_MEM_IMAGE 1 |
| #endif |
|
|
| #ifdef ABSL_HAVE_ELF_MEM_IMAGE |
|
|
| #include <link.h> |
|
|
| #if defined(__FreeBSD__) && !defined(ElfW) |
| #define ElfW(x) __ElfN(x) |
| #endif |
|
|
| namespace absl { |
| ABSL_NAMESPACE_BEGIN |
| namespace debugging_internal { |
|
|
| |
| class ElfMemImage { |
| private: |
| |
| static const int kInvalidBaseSentinel; |
|
|
| public: |
| |
| static constexpr const void *const kInvalidBase = |
| static_cast<const void*>(&kInvalidBaseSentinel); |
|
|
| |
| |
| |
| struct SymbolInfo { |
| const char *name; |
| const char *version; |
| |
| const void *address; |
| const ElfW(Sym) *symbol; |
| }; |
|
|
| |
| class SymbolIterator { |
| public: |
| friend class ElfMemImage; |
| const SymbolInfo *operator->() const; |
| const SymbolInfo &operator*() const; |
| SymbolIterator& operator++(); |
| bool operator!=(const SymbolIterator &rhs) const; |
| bool operator==(const SymbolIterator &rhs) const; |
| private: |
| SymbolIterator(const void *const image, int index); |
| void Update(int incr); |
| SymbolInfo info_; |
| int index_; |
| const void *const image_; |
| }; |
|
|
|
|
| explicit ElfMemImage(const void *base); |
| void Init(const void *base); |
| bool IsPresent() const { return ehdr_ != nullptr; } |
| const ElfW(Phdr)* GetPhdr(int index) const; |
| const ElfW(Sym)* GetDynsym(int index) const; |
| const ElfW(Versym)* GetVersym(int index) const; |
| const ElfW(Verdef)* GetVerdef(int index) const; |
| const ElfW(Verdaux)* GetVerdefAux(const ElfW(Verdef) *verdef) const; |
| const char* GetDynstr(ElfW(Word) offset) const; |
| const void* GetSymAddr(const ElfW(Sym) *sym) const; |
| const char* GetVerstr(ElfW(Word) offset) const; |
| int GetNumSymbols() const; |
|
|
| SymbolIterator begin() const; |
| SymbolIterator end() const; |
|
|
| |
| |
| |
| |
| bool LookupSymbol(const char *name, const char *version, |
| int symbol_type, SymbolInfo *info_out) const; |
|
|
| |
| |
| |
| |
| bool LookupSymbolByAddress(const void *address, SymbolInfo *info_out) const; |
|
|
| private: |
| const ElfW(Ehdr) *ehdr_; |
| const ElfW(Sym) *dynsym_; |
| const ElfW(Versym) *versym_; |
| const ElfW(Verdef) *verdef_; |
| const ElfW(Word) *hash_; |
| const char *dynstr_; |
| size_t strsize_; |
| size_t verdefnum_; |
| ElfW(Addr) link_base_; |
| }; |
|
|
| } |
| ABSL_NAMESPACE_END |
| } |
|
|
| #endif |
|
|
| #endif |
|
|