1// Copyright 2014 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
12namespace crazy {
13
14class ElfView;
15
16// An ElfSymbols instance holds information about symbols in a mapped ELF
17// binary.
18class 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::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