1 /* 2 * Copyright 2008-2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Copyright 2003-2011, Axel Dörfler, axeld@pinc-software.de. 4 * Distributed under the terms of the MIT License. 5 * 6 * Copyright 2002, Manuel J. Petit. All rights reserved. 7 * Copyright 2001, Travis Geiselbrecht. All rights reserved. 8 * Distributed under the terms of the NewOS License. 9 */ 10 11 #ifndef _RUNTIME_LOADER_H 12 #define _RUNTIME_LOADER_H 13 14 #include <image.h> 15 #include <OS.h> 16 17 #include <elf32.h> 18 #include <elf64.h> 19 20 21 // #pragma mark - runtime loader libroot interface 22 23 24 struct user_space_program_args; 25 struct SymbolLookupInfo; 26 27 struct rld_export { 28 // runtime loader API export 29 image_id (*load_add_on)(char const *path, uint32 flags); 30 status_t (*unload_add_on)(image_id imageID); 31 image_id (*load_library)(char const *path, uint32 flags, void **_handle); 32 status_t (*unload_library)(void* handle); 33 status_t (*get_image_symbol)(image_id imageID, char const *symbolName, 34 int32 symbolType, bool recursive, image_id *_inImage, void **_location); 35 status_t (*get_library_symbol)(void* handle, void* caller, 36 const char* symbolName, void **_location); 37 status_t (*get_nth_image_symbol)(image_id imageID, int32 num, 38 char *symbolName, int32 *nameLength, int32 *symbolType, 39 void **_location); 40 status_t (*get_nearest_symbol_at_address)(void* address, 41 image_id* _imageID, char** _imagePath, char** _symbolName, 42 int32* _type, void** _location); 43 status_t (*test_executable)(const char *path, char *interpreter); 44 status_t (*get_executable_architecture)(const char *path, 45 const char** _architecture); 46 status_t (*get_next_image_dependency)(image_id id, uint32 *cookie, 47 const char **_name); 48 49 status_t (*reinit_after_fork)(); 50 51 void (*call_atexit_hooks_for_range)(addr_t start, addr_t size); 52 53 void (*call_termination_hooks)(); 54 55 const struct user_space_program_args *program_args; 56 const void* commpage_address; 57 int abi_version; 58 }; 59 60 extern struct rld_export *__gRuntimeLoader; 61 62 63 // #pragma mark - runtime loader debugger interface 64 65 66 struct RuntimeLoaderSymbolPatcher; 67 68 typedef struct elf_region_t { 69 area_id id; 70 addr_t start; 71 addr_t size; 72 addr_t vmstart; 73 addr_t vmsize; 74 addr_t fdstart; 75 addr_t fdsize; 76 long delta; 77 uint32 flags; 78 } elf_region_t; 79 80 typedef struct elf_version_info { 81 uint32 hash; // version name hash 82 const char *name; // version name 83 const char *file_name; // dependency file name (needed versions only) 84 } elf_version_info; 85 86 typedef struct image_t { 87 // image identification 88 char path[B_PATH_NAME_LENGTH]; 89 char name[B_OS_NAME_LENGTH]; 90 image_id id; 91 image_type type; 92 93 struct image_t *next; 94 struct image_t *prev; 95 int32 ref_count; 96 uint32 flags; 97 98 uint32 api_version; 99 uint32 abi; 100 101 addr_t entry_point; 102 addr_t init_routine; 103 addr_t term_routine; 104 addr_t dynamic_ptr; // pointer to the dynamic section 105 106 // pointer to symbol participation data structures 107 uint32 *symhash; 108 elf_sym *syms; 109 char *strtab; 110 elf_rel *rel; 111 int rel_len; 112 elf_rela *rela; 113 int rela_len; 114 elf_rel *pltrel; 115 int pltrel_len; 116 117 uint32 num_needed; 118 struct image_t **needed; 119 120 // versioning related structures 121 uint32 num_version_definitions; 122 elf_verdef *version_definitions; 123 uint32 num_needed_versions; 124 elf_verneed *needed_versions; 125 elf_versym *symbol_versions; 126 elf_version_info *versions; 127 uint32 num_versions; 128 129 #ifdef __cplusplus 130 elf_sym* (*find_undefined_symbol)(struct image_t* rootImage, 131 struct image_t* image, 132 const SymbolLookupInfo& lookupInfo, 133 struct image_t** foundInImage); 134 #else 135 elf_sym* (*find_undefined_symbol)(struct image_t* rootImage, 136 struct image_t* image, 137 const struct SymbolLookupInfo* lookupInfo, 138 struct image_t** foundInImage); 139 #endif 140 141 // Singly-linked list of symbol patchers for symbols defined respectively 142 // referenced by this image. 143 struct RuntimeLoaderSymbolPatcher *defined_symbol_patchers; 144 struct RuntimeLoaderSymbolPatcher *undefined_symbol_patchers; 145 146 // describes the text and data regions 147 uint32 num_regions; 148 elf_region_t regions[1]; 149 } image_t; 150 151 typedef struct image_queue_t { 152 image_t *head; 153 image_t *tail; 154 } image_queue_t; 155 156 // image_t::flags 157 #define IMAGE_FLAG_RTLD_MASK 0x03 158 // RTLD_{LAZY,NOW} | RTLD_{LOCAL,GLOBAL} 159 160 #define STRING(image, offset) ((char*)(&(image)->strtab[(offset)])) 161 #define SYMNAME(image, sym) STRING(image, (sym)->st_name) 162 #define SYMBOL(image, num) (&(image)->syms[num]) 163 #define HASHTABSIZE(image) ((image)->symhash[0]) 164 #define HASHBUCKETS(image) ((unsigned int*)&(image)->symhash[2]) 165 #define HASHCHAINS(image) ((unsigned int*)&(image)->symhash[2+HASHTABSIZE(image)]) 166 167 168 // The name of the area the runtime loader creates for debugging purposes. 169 #define RUNTIME_LOADER_DEBUG_AREA_NAME "_rld_debug_" 170 171 // The contents of the runtime loader debug area. 172 typedef struct runtime_loader_debug_area { 173 image_queue_t *loaded_images; 174 } runtime_loader_debug_area; 175 176 177 // #pragma mark - runtime loader add-on interface 178 179 180 // symbol patcher callback 181 typedef void runtime_loader_symbol_patcher(void* cookie, 182 struct image_t* rootImage, struct image_t* image, const char* name, 183 struct image_t** foundInImage, void** symbol, int32* type); 184 185 // interface provided to add-ons 186 struct runtime_loader_add_on_export { 187 status_t (*register_defined_symbol_patcher)(struct image_t* image, 188 runtime_loader_symbol_patcher* patcher, void* cookie); 189 void (*unregister_defined_symbol_patcher)(struct image_t* image, 190 runtime_loader_symbol_patcher* patcher, void* cookie); 191 status_t (*register_undefined_symbol_patcher)(struct image_t* image, 192 runtime_loader_symbol_patcher* patcher, void* cookie); 193 void (*unregister_undefined_symbol_patcher)(struct image_t* image, 194 runtime_loader_symbol_patcher* patcher, void* cookie); 195 }; 196 197 198 #define RUNTIME_LOADER_ADD_ON_VERSION 1 199 200 typedef struct runtime_loader_add_on { 201 uint32 version; 202 uint32 flags; 203 204 // called after the add-on image has been loaded 205 void (*init)(struct rld_export* standardInterface, 206 struct runtime_loader_add_on_export* addOnInterface); 207 208 // called whenever the respective image event occurs 209 void (*image_loaded)(struct image_t* image); 210 void (*image_relocated)(struct image_t* image); 211 void (*image_initialized)(struct image_t* image); 212 void (*image_uninitializing)(struct image_t* image); 213 void (*image_unloading)(struct image_t* image); 214 } runtime_loader_add_on; 215 216 // This is the variable a preloaded shared object has to export to get picked up 217 // by the runtime loader as an add-on. 218 extern runtime_loader_add_on __gRuntimeLoaderAddOn; 219 220 #endif // _RUNTIME_LOADER_H 221