1/* 2 * Copyright 2003-2011, Axel D��rfler, axeld@pinc-software.de. 3 * Distributed under the terms of the MIT License. 4 * 5 * Copyright 2002, Manuel J. Petit. All rights reserved. 6 * Distributed under the terms of the NewOS License. 7 */ 8 9 10#include "runtime_loader_private.h" 11#include "elf_tls.h" 12 13 14// exported via the rld_export structure in user space program arguments 15 16 17static image_id 18export_load_add_on(char const *name, uint32 flags) 19{ 20 void* handle; 21 return load_library(name, flags, true, NULL, &handle); 22} 23 24 25static status_t 26export_unload_add_on(image_id id) 27{ 28 return unload_library(NULL, id, true); 29} 30 31 32static image_id 33export_load_library(char const *name, uint32 flags, void* caller, 34 void **_handle) 35{ 36 return load_library(name, flags, false, caller, _handle); 37} 38 39 40static status_t 41export_unload_library(void* handle) 42{ 43 return unload_library(handle, -1, false); 44} 45 46 47status_t 48reinit_after_fork() 49{ 50 status_t returnstatus = B_OK; 51 if (status_t status = elf_reinit_after_fork()) 52 returnstatus = status; 53 if (status_t status = heap_reinit_after_fork()) 54 returnstatus = status; 55 return returnstatus; 56} 57 58 59struct rld_export gRuntimeLoader = { 60 // dynamic loading support API 61 export_load_add_on, 62 export_unload_add_on, 63 export_load_library, 64 export_unload_library, 65 get_symbol, 66 get_library_symbol, 67 get_nth_symbol, 68 get_nearest_symbol_at_address, 69 test_executable, 70 get_executable_architecture, 71 get_next_image_dependency, 72 get_tls_address, 73 destroy_thread_tls, 74 75 reinit_after_fork, 76 NULL, // call_atexit_hooks_for_range 77 terminate_program, 78 79 // the following values will be set later 80 NULL, // program_args 81 NULL, // commpage_address 82 0 // ABI version 83}; 84 85rld_export* __gRuntimeLoader = &gRuntimeLoader; 86 87 88void 89rldexport_init(void) 90{ 91 gRuntimeLoader.program_args = gProgramArgs; 92 gRuntimeLoader.commpage_address = __gCommPageAddress; 93} 94 95 96/*! Is called for all images, and sets the minimum ABI version found to the 97 gRuntimeLoader.abi_version field and the minimum API version found to the 98 gRuntimeLoader.api_version field. 99*/ 100void 101set_abi_api_version(int abi_version, int api_version) 102{ 103 if (gRuntimeLoader.abi_version == 0 104 || gRuntimeLoader.abi_version > abi_version) { 105 gRuntimeLoader.abi_version = abi_version; 106 } 107 if (gRuntimeLoader.api_version == 0 108 || gRuntimeLoader.api_version > api_version) { 109 gRuntimeLoader.api_version = api_version; 110 } 111} 112