Index: third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_relocator.h |
diff --git a/third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_relocator.h b/third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_relocator.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1e0feb7fef8f8bd85c3e267e06100d1da2024052 |
--- /dev/null |
+++ b/third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_relocator.h |
@@ -0,0 +1,105 @@ |
+// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CRAZY_LINKER_ELF_RELOCATOR_H |
+#define CRAZY_LINKER_ELF_RELOCATOR_H |
+ |
+#include "crazy_linker_error.h" |
+#include "elf_traits.h" |
+ |
+namespace crazy { |
+ |
+// A class used to perform ELF relocations in a library. |
+// Usage is: |
+// 1/ Create new instance. |
+// 2/ Call Init(). |
+// 3/ Call Apply() to apply all relocations. |
+// |
+// If any of these steps fail, the library will be in inconsistent |
+// state and must be unloaded/unmapped as soon as possible by the |
+// caller to avoid any issue. |
+class ElfRelocator { |
+public: |
+ // Abstract class used to resolve symbol names into addresses. |
+ // Callers of ::Apply() should pass the address of a derived class |
+ // that properly implements the Lookup() method. |
+ class SymbolResolver { |
+ public: |
+ SymbolResolver() {} |
+ ~SymbolResolver() {} |
+ virtual void* Lookup(const char* symbol_name) = 0; |
+ }; |
+ |
+ ElfRelocator(); |
+ |
+ // Initialize the relocator. This will parse the library's dynamic |
+ // table to populate the structure. |
+ // |phdr| is the library's program header address. |
+ // |phdr_count| is the number of program header entries. |
+ // |load_bias| is the library load bias. |
+ // |dynamic| is the library's dynamic table. |
+ // |dyn_count| is the number of dynamic table entries. |
+ // On failure, return false and sets the |error| message. |
+ bool Init(const ELF::Phdr* phdr, |
+ size_t phdr_count, |
+ size_t load_bias, |
+ const ELF::Dyn* dynamic, |
+ size_t dyn_count, |
+ Error* error); |
+ |
+ // After initialization, apply all relocations in the library. |
+ // |resolver| must be an non-abstract instance of SymbolResolver |
+ // that will be used to resolve symbol lookups during relocations. |
+ // |string_table| is the library's string table. |
+ // |symbol_table| is the library's symbol table. |
+ // On failure, returns false and sets the |error| message. |
+ bool Apply(SymbolResolver* resolver, |
+ const char* string_table, |
+ const ELF::Sym* symbol_table, |
+ Error* error); |
+ |
+private: |
+ bool ApplyRelocs(const ELF::Rel* rel, size_t rel_count, Error* error); |
+ |
+#ifdef __mips__ |
+ bool RelocateMipsGot(Error* error); |
+#endif |
+ |
+ // Program header table |
+ const ELF::Phdr* phdr_; |
+ size_t phdr_count_; |
+ |
+ // Load bias to apply to all virtual address in the library. |
+ size_t load_bias_; |
+ |
+ // Relocations for the GOT and the PLT section that contains |
+ // the trampolines to call external symbols. |
+ unsigned* plt_got_; |
+ ELF::Rel* plt_rel_; |
+ size_t plt_rel_count_; |
+ |
+ // Relocations for the rest of the library. |
+ ELF::Rel* rel_; |
+ size_t rel_count_; |
+ |
+ // MIPS-specific relocation fields. |
+#if defined(__mips__) |
+ unsigned mips_symtabno_; |
+ unsigned mips_local_gotno_; |
+ unsigned mips_gotsym_; |
+#endif |
+ |
+ bool has_text_relocations_; |
+ bool has_symbolic_; |
+ |
+ // Used only during Apply(). |
+ SymbolResolver* resolver_; |
+ const char* string_table_; |
+ const ELF::Sym* symbol_table_; |
+}; |
+ |
+} // namespace crazy |
+ |
+ |
+#endif // CRAZY_LINKER_ELF_RELOCATOR_H |