1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef CRAZY_LINKER_SHARED_LIBRARY_H 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define CRAZY_LINKER_SHARED_LIBRARY_H 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <link.h> 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "crazy_linker_elf_relro.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "crazy_linker_elf_symbols.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "crazy_linker_elf_view.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "crazy_linker_error.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "crazy_linker_rdebug.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "crazy_linker_util.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "elf_traits.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace crazy { 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class LibraryList; 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class LibraryView; 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// A class that models a shared library loaded by the crazy linker. 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Libraries have dependencies (which are listed in their dynamic section 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// as DT_NEEDED entries). Circular dependencies are forbidden, so they 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// form an ADG, where the root is the crazy linker itself, since all 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// libraries that it loads will depend on it (to ensure their 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// dlopen/dlsym/dlclose calls are properly wrapped). 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SharedLibrary { 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SharedLibrary(); 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ~SharedLibrary(); 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t load_address() const { return view_.load_address(); } 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t load_size() const { return view_.load_size(); } 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t load_bias() const { return view_.load_bias(); } 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const ELF::Phdr* phdr() const { return view_.phdr(); } 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t phdr_count() const { return view_.phdr_count(); } 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char* base_name() const { return base_name_; } 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Load a library (without its dependents) from an ELF file. 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Note: This does not apply relocations, nor runs constructors. 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |full_path| if the file full path. 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |load_address| is the page-aligned load address in memory, or 0. 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |file_offset| is the page-aligned file offset. 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // On failure, return false and set |error| message. 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // After this, the caller should load all library dependencies, 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Then call Relocate() and CallConstructors() to complete the 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // operation. 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool Load(const char* full_path, 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t load_address, 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t file_offset, 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Error* error); 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Relocate this library, assuming all its dependencies are already 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // loaded in |lib_list|. On failure, return false and set |error| 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // message. 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool Relocate(LibraryList* lib_list, 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Vector<LibraryView*>* dependencies, 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Error* error); 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void GetInfo(size_t* load_address, 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t* load_size, 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t* relro_start, 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t* relro_size) { 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *load_address = view_.load_address(); 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *load_size = view_.load_size(); 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *relro_start = relro_start_; 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *relro_size = relro_size_; 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Returns true iff a given library is mapped to a virtual address range 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // that contains a given address. 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool ContainsAddress(void* address) const { 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t addr = reinterpret_cast<size_t>(address); 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return load_address() <= addr && addr <= load_address() + load_size(); 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Call all constructors in the library. 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void CallConstructors(); 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Call all destructors in the library. 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void CallDestructors(); 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Return the ELF symbol entry for a given symbol, if defined by 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // this library, or NULL otherwise. 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const ELF::Sym* LookupSymbolEntry(const char* symbol_name); 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Find the nearest symbol near a given |address|. On success, return 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // true and set |*sym_name| to the symbol name, |*sym_addr| to its address 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // in memory, and |*sym_size| to its size in bytes, if any. 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool FindNearestSymbolForAddress(void* address, 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char** sym_name, 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void** sym_addr, 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t* sym_size) { 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return symbols_.LookupNearestByAddress( 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) address, load_bias(), sym_name, sym_addr, sym_size); 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Return the address of a given |symbol_name| if it is exported 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // by the library, NULL otherwise. 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void* FindAddressForSymbol(const char* symbol_name); 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Create a new Ashmem region holding a copy of the library's RELRO section, 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // potentially relocated for a new |load_address|. On success, return true 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // and sets |*relro_start|, |*relro_size| and |*relro_fd|. Note that the 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // RELRO start address is adjusted for |load_address|, and that the caller 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // becomes the owner of |*relro_fd|. On failure, return false and set 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |error| message. 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool CreateSharedRelro(size_t load_address, 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t* relro_start, 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t* relro_size, 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int* relro_fd, 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Error* error); 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Try to use a shared relro section from another process. 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // On success, return true. On failure return false and 121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // sets |error| message. 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool UseSharedRelro(size_t relro_start, 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t relro_size, 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int relro_fd, 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Error* error); 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Look for a symbol named 'JNI_OnLoad' in this library, and if it 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // exists, call it with |java_vm| as the first parameter. If the 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // function result is less than |minimum_jni_version|, fail with 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // a message in |error|. On success, return true, and record 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |java_vm| to call 'JNI_OnUnload' at unload time, if present. 132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool SetJavaVM(void* java_vm, int minimum_jni_version, Error* error); 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Call 'JNI_OnUnload()' is necessary, i.e. if there was a succesful call 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // to SetJavaVM() before. This will pass the same |java_vm| value to the 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // callback, if it is present in the library. 137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void CallJniOnUnload(); 138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Helper class to iterate over dependencies in a given SharedLibrary. 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Usage: 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // SharedLibary::DependencyIterator iter(lib); 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // while (iter.GetNext() { 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // dependency_name = iter.GetName(); 144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // ... 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // } 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) class DependencyIterator { 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DependencyIterator(SharedLibrary* lib) 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : iter_(&lib->view_), symbols_(&lib->symbols_), dep_name_(NULL) {} 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool GetNext(); 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char* GetName() const { return dep_name_; } 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DependencyIterator(); 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DependencyIterator(const DependencyIterator&); 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DependencyIterator& operator=(const DependencyIterator&); 159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ElfView::DynamicIterator iter_; 161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const ElfSymbols* symbols_; 162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char* dep_name_; 163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) typedef void (*linker_function_t)(); 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) friend class LibraryList; 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ElfView view_; 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ElfSymbols symbols_; 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ELF::Addr relro_start_; 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ELF::Addr relro_size_; 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool relro_used_; 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SharedLibrary* list_next_; 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SharedLibrary* list_prev_; 179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) unsigned flags_; 180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) linker_function_t* preinit_array_; 182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t preinit_array_count_; 183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) linker_function_t* init_array_; 184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t init_array_count_; 185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) linker_function_t* fini_array_; 186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t fini_array_count_; 187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) linker_function_t init_func_; 188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) linker_function_t fini_func_; 189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifdef __arm__ 191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // ARM EABI section used for stack unwinding. 192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) unsigned* arm_exidx_; 193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t arm_exidx_count_; 19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(__arm__) || defined(__aarch64__) 19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Packed relocations data, NULL if absent. 19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) uint8_t* packed_relocations_; 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) link_map_t link_map_; 202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool has_DT_SYMBOLIC_; 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void* java_vm_; 206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char* base_name_; 208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) char full_path_[512]; 209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace crazy 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // CRAZY_LINKER_SHARED_LIBRARY_H 214