Index: third_party/android_crazy_linker/src/src/crazy_linker_elf_relocations.h |
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_elf_relocations.h b/third_party/android_crazy_linker/src/src/crazy_linker_elf_relocations.h |
index 71ed33b1a60ba2be1eb5fb5a6c0d5e1818862285..e9481bd0e882a0cc7210d290272b2bbb6a010eef 100644 |
--- a/third_party/android_crazy_linker/src/src/crazy_linker_elf_relocations.h |
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_elf_relocations.h |
@@ -8,6 +8,7 @@ |
#include <string.h> |
#include <unistd.h> |
+#include "crazy_linker_leb128.h" |
#include "elf_traits.h" |
namespace crazy { |
@@ -44,12 +45,6 @@ class ElfRelocations { |
SymbolResolver* resolver, |
Error* error); |
-#if defined(__arm__) || defined(__aarch64__) |
- // Register packed relocations to apply. |
- // |packed_relocs| is a pointer to packed relocations data. |
- void RegisterPackedRelocations(uint8_t* packed_relocations); |
-#endif |
- |
// This function is used to adjust relocated addresses in a copy of an |
// existing section of an ELF binary. I.e. |src_addr|...|src_addr + size| |
// must be inside the mapped ELF binary, this function will first copy its |
@@ -70,13 +65,21 @@ class ElfRelocations { |
ELF::Addr reloc, |
ELF::Addr* sym_addr, |
Error* error); |
+ bool ApplyResolvedRelaReloc(const ELF::Rela* rela, |
+ ELF::Addr sym_addr, |
+ bool resolved, |
+ Error* error); |
+ bool ApplyResolvedRelReloc(const ELF::Rel* rel, |
+ ELF::Addr sym_addr, |
+ bool resolved, |
+ Error* error); |
bool ApplyRelaReloc(const ELF::Rela* rela, |
- ELF::Addr sym_addr, |
- bool resolved, |
+ const ElfSymbols* symbols, |
+ SymbolResolver* resolver, |
Error* error); |
bool ApplyRelReloc(const ELF::Rel* rel, |
- ELF::Addr sym_addr, |
- bool resolved, |
+ const ElfSymbols* symbols, |
+ SymbolResolver* resolver, |
Error* error); |
bool ApplyRelaRelocs(const ELF::Rela* relocs, |
size_t relocs_count, |
@@ -100,17 +103,39 @@ class ElfRelocations { |
size_t dst_addr, |
size_t map_addr, |
size_t size); |
- |
-#if defined(__arm__) || defined(__aarch64__) |
- // Apply packed rel or rela relocations. On error, return false. |
- bool ApplyPackedRel(const uint8_t* packed_relocations, Error* error); |
- bool ApplyPackedRela(const uint8_t* packed_relocations, Error* error); |
- |
- // Apply packed relocations. |
- // On error, return false and set |error| message. No-op if no packed |
- // relocations were registered. |
- bool ApplyPackedRelocations(Error* error); |
-#endif |
+ void RelocateAndroidReloc(const ELF::Rela* relocation, |
+ size_t src_addr, |
+ size_t dst_addr, |
+ size_t map_addr, |
+ size_t size); |
+ |
+ // Android packed relocations unpacker. Calls the given handler for |
+ // each relocation in the unpacking stream. |
+ typedef bool (*RelocationHandler)(ElfRelocations* relocations, |
+ const ELF::Rela* relocation, |
+ void* opaque); |
+ bool ForEachAndroidRelocation(RelocationHandler handler, |
+ void* opaque); |
+ |
+ // Apply Android packed relocations. |
+ // On error, return false and set |error| message. |
+ // The static function is the ForEachAndroidRelocation() handler. |
+ bool ApplyAndroidRelocations(const ElfSymbols* symbols, |
+ SymbolResolver* resolver, |
+ Error* error); |
+ static bool ApplyAndroidRelocation(ElfRelocations* relocations, |
+ const ELF::Rela* relocation, |
+ void* opaque); |
+ |
+ // Relocate Android packed relocations. |
+ // The static function is the ForEachAndroidRelocation() handler. |
+ void RelocateAndroidRelocations(size_t src_addr, |
+ size_t dst_addr, |
+ size_t map_addr, |
+ size_t size); |
+ static bool RelocateAndroidRelocation(ElfRelocations* relocations, |
+ const ELF::Rela* relocation, |
+ void* opaque); |
#if defined(__mips__) |
bool RelocateMipsGot(const ElfSymbols* symbols, |
@@ -137,9 +162,8 @@ class ElfRelocations { |
ELF::Word mips_gotsym_; |
#endif |
-#if defined(__arm__) || defined(__aarch64__) |
- uint8_t* packed_relocations_; |
-#endif |
+ uint8_t* android_relocations_; |
+ size_t android_relocations_size_; |
bool has_text_relocations_; |
bool has_symbolic_; |