1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <android/dlext.h> 18 #include <dlfcn.h> 19 #include <link.h> 20 #include <signal.h> 21 #include <stdlib.h> 22 23 // These functions are exported by the loader 24 // TODO(dimitry): replace these with reference to libc.so 25 26 extern "C" { 27 28 __attribute__((__weak__, visibility("default"))) 29 void __loader_android_get_LD_LIBRARY_PATH(char* buffer, size_t buffer_size); 30 31 __attribute__((__weak__, visibility("default"))) 32 void* __loader_dlopen(const char* filename, int flags, const void* caller_addr); 33 34 __attribute__((__weak__, visibility("default"))) 35 char* __loader_dlerror(); 36 37 __attribute__((__weak__, visibility("default"))) 38 void* __loader_dlsym(void* handle, const char* symbol, const void* caller_addr); 39 40 __attribute__((__weak__, visibility("default"))) 41 void* __loader_dlvsym(void* handle, 42 const char* symbol, 43 const char* version, 44 const void* caller_addr); 45 46 __attribute__((__weak__, visibility("default"))) 47 int __loader_dladdr(const void* addr, Dl_info* info); 48 49 __attribute__((__weak__, visibility("default"))) 50 int __loader_dlclose(void* handle); 51 52 #if defined(__arm__) 53 __attribute__((__weak__, visibility("default"))) 54 _Unwind_Ptr __loader_dl_unwind_find_exidx(_Unwind_Ptr pc, int* pcount); 55 #endif 56 57 __attribute__((__weak__, visibility("default"))) 58 int __loader_dl_iterate_phdr(int (*cb)(struct dl_phdr_info* info, size_t size, void* data), 59 void* data); 60 61 __attribute__((__weak__, visibility("default"))) 62 void __loader_android_get_LD_LIBRARY_PATH(char* buffer, size_t buffer_size); 63 64 __attribute__((__weak__, visibility("default"))) 65 void __loader_android_update_LD_LIBRARY_PATH(const char* ld_library_path); 66 67 __attribute__((__weak__, visibility("default"))) 68 void* __loader_android_dlopen_ext(const char* filename, 69 int flag, 70 const android_dlextinfo* extinfo, 71 const void* caller_addr); 72 73 __attribute__((__weak__, visibility("default"))) 74 int __loader_android_get_application_target_sdk_version(); 75 76 __attribute__((__weak__, visibility("default"))) bool __loader_android_handle_signal( 77 int signal_number, siginfo_t* info, void* context); 78 79 // Proxy calls to bionic loader 80 __attribute__((__weak__)) android_get_LD_LIBRARY_PATH(char * buffer,size_t buffer_size)81 void android_get_LD_LIBRARY_PATH(char* buffer, size_t buffer_size) { 82 __loader_android_get_LD_LIBRARY_PATH(buffer, buffer_size); 83 } 84 85 __attribute__((__weak__)) dlopen(const char * filename,int flag)86 void* dlopen(const char* filename, int flag) { 87 const void* caller_addr = __builtin_return_address(0); 88 return __loader_dlopen(filename, flag, caller_addr); 89 } 90 91 __attribute__((__weak__)) dlerror()92 char* dlerror() { 93 return __loader_dlerror(); 94 } 95 96 __attribute__((__weak__)) dlsym(void * handle,const char * symbol)97 void* dlsym(void* handle, const char* symbol) { 98 const void* caller_addr = __builtin_return_address(0); 99 return __loader_dlsym(handle, symbol, caller_addr); 100 } 101 102 __attribute__((__weak__)) dlvsym(void * handle,const char * symbol,const char * version)103 void* dlvsym(void* handle, const char* symbol, const char* version) { 104 const void* caller_addr = __builtin_return_address(0); 105 return __loader_dlvsym(handle, symbol, version, caller_addr); 106 } 107 108 __attribute__((__weak__)) dladdr(const void * addr,Dl_info * info)109 int dladdr(const void* addr, Dl_info* info) { 110 return __loader_dladdr(addr, info); 111 } 112 113 __attribute__((__weak__)) dlclose(void * handle)114 int dlclose(void* handle) { 115 return __loader_dlclose(handle); 116 } 117 118 #if defined(__arm__) 119 __attribute__((__weak__)) dl_unwind_find_exidx(_Unwind_Ptr pc,int * pcount)120 _Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr pc, int* pcount) { 121 return __loader_dl_unwind_find_exidx(pc, pcount); 122 } 123 #endif 124 125 /* 126 * This needs to be defined as weak because it is also defined in libc.a. 127 * Without this, static executables will have a multiple definition error. 128 */ 129 __attribute__((__weak__)) dl_iterate_phdr(int (* cb)(struct dl_phdr_info * info,size_t size,void * data),void * data)130 int dl_iterate_phdr(int (*cb)(struct dl_phdr_info* info, size_t size, void* data), void* data) { 131 return __loader_dl_iterate_phdr(cb, data); 132 } 133 134 __attribute__((__weak__)) android_dlopen_ext(const char * filename,int flag,const android_dlextinfo * extinfo)135 void* android_dlopen_ext(const char* filename, int flag, const android_dlextinfo* extinfo) { 136 const void* caller_addr = __builtin_return_address(0); 137 return __loader_android_dlopen_ext(filename, flag, extinfo, caller_addr); 138 } 139 140 __attribute__((__weak__)) android_get_application_target_sdk_version()141 int android_get_application_target_sdk_version() { 142 return __loader_android_get_application_target_sdk_version(); 143 } 144 145 // Returns true if this function handled the signal, false if the caller should handle the signal 146 // itself. This function returns true if the sigchain handler should immediately return, which 147 // happens when the signal came from GWP-ASan, and we've dumped a debuggerd report and patched up 148 // the GWP-ASan allocator to recover from the fault, and regular execution of the program can 149 // continue. android_handle_signal(int signal_number,siginfo_t * info,void * context)150 __attribute__((__weak__)) bool android_handle_signal(int signal_number, siginfo_t* info, 151 void* context) { 152 return __loader_android_handle_signal(signal_number, info, context); 153 } 154 155 } // extern "C" 156