OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #ifndef CRAZY_LINKER_ELF_SYMBOLS_H |
| 6 #define CRAZY_LINKER_ELF_SYMBOLS_H |
| 7 |
| 8 #include <string.h> |
| 9 |
| 10 #include "elf_traits.h" |
| 11 |
| 12 namespace crazy { |
| 13 |
| 14 class ElfView; |
| 15 |
| 16 // An ElfSymbols instance holds information about symbols in a mapped ELF |
| 17 // binary. |
| 18 class ElfSymbols { |
| 19 public: |
| 20 ElfSymbols() { ::memset(this, 0, sizeof(*this)); } |
| 21 ~ElfSymbols() {} |
| 22 |
| 23 bool Init(const ElfView* view); |
| 24 |
| 25 const ELF::Sym* LookupByName(const char* symbol_name) const; |
| 26 |
| 27 const ELF::Sym* LookupById(size_t symbol_id) const { |
| 28 return &symbol_table_[symbol_id]; |
| 29 } |
| 30 |
| 31 const ELF::Sym* LookupByAddress(void* address, size_t load_bias) const; |
| 32 |
| 33 // Returns true iff symbol with id |symbol_id| is weak. |
| 34 bool IsWeakById(size_t symbol_id) const { |
| 35 return ELF_ST_BIND(symbol_table_[symbol_id].st_info) == STB_WEAK; |
| 36 } |
| 37 |
| 38 const char* LookupNameById(size_t symbol_id) const { |
| 39 const ELF::Sym* sym = LookupById(symbol_id); |
| 40 if (!sym) |
| 41 return NULL; |
| 42 return string_table_ + sym->st_name; |
| 43 } |
| 44 |
| 45 void* LookupAddressByName(const char* symbol_name, size_t load_bias) const { |
| 46 const ELF::Sym* sym = LookupByName(symbol_name); |
| 47 if (!sym) |
| 48 return NULL; |
| 49 return reinterpret_cast<void*>(load_bias + sym->st_value); |
| 50 } |
| 51 |
| 52 bool LookupNearestByAddress(void* address, |
| 53 size_t load_bias, |
| 54 const char** sym_name, |
| 55 void** sym_addr, |
| 56 size_t* sym_size) const; |
| 57 |
| 58 const char* GetStringById(size_t str_id) const { |
| 59 return string_table_ + str_id; |
| 60 } |
| 61 |
| 62 // TODO(digit): Remove this once ElfRelocator is gone. |
| 63 const ELF::Sym* symbol_table() const { return symbol_table_; } |
| 64 const char* string_table() const { return string_table_; } |
| 65 |
| 66 private: |
| 67 const ELF::Sym* symbol_table_; |
| 68 const char* string_table_; |
| 69 ELF::Addr* hash_bucket_; |
| 70 size_t hash_bucket_size_; |
| 71 ELF::Addr* hash_chain_; |
| 72 size_t hash_chain_size_; |
| 73 }; |
| 74 |
| 75 } // namespace crazy |
| 76 |
| 77 #endif // CRAZY_LINKER_ELF_SYMBOLS_H |
OLD | NEW |