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:
ElfSymbols()20   ElfSymbols() { ::memset(this, 0, sizeof(*this)); }
~ElfSymbols()21   ~ElfSymbols() {}
22 
23   bool Init(const ElfView* view);
24 
25   const ELF::Sym* LookupByName(const char* symbol_name) const;
26 
LookupById(size_t symbol_id)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.
IsWeakById(size_t symbol_id)34   bool IsWeakById(size_t symbol_id) const {
35     return ELF_ST_BIND(symbol_table_[symbol_id].st_info) == STB_WEAK;
36   }
37 
LookupNameById(size_t symbol_id)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 
LookupAddressByName(const char * symbol_name,size_t load_bias)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 
GetStringById(size_t str_id)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.
symbol_table()63   const ELF::Sym* symbol_table() const { return symbol_table_; }
string_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::Word* hash_bucket_;
70   size_t hash_bucket_size_;
71   ELF::Word* hash_chain_;
72   size_t hash_chain_size_;
73 };
74 
75 }  // namespace crazy
76 
77 #endif  // CRAZY_LINKER_ELF_SYMBOLS_H
78