1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #ifndef __DLFCN_H__ 30 #define __DLFCN_H__ 31 32 #include <stdint.h> 33 #include <sys/cdefs.h> 34 35 __BEGIN_DECLS 36 37 #if defined(__clang__) 38 #pragma clang diagnostic push 39 #pragma clang diagnostic ignored "-Wnullability-completeness" 40 #endif 41 42 typedef struct { 43 /* Pathname of shared object that contains address. */ 44 const char* dli_fname; 45 /* Address at which shared object is loaded. */ 46 void* dli_fbase; 47 /* Name of nearest symbol with address lower than addr. */ 48 const char* dli_sname; 49 /* Exact address of symbol named in dli_sname. */ 50 void* dli_saddr; 51 } Dl_info; 52 53 void* dlopen(const char* filename, int flag); 54 int dlclose(void* _Nonnull handle); 55 char* dlerror(void); 56 void* dlsym(void* handle, const char* _Nonnull symbol); 57 void* dlvsym(void* handle, const char* _Nonnull symbol, const char* _Nonnull version) __INTRODUCED_IN(24); 58 int dladdr(const void* addr, Dl_info* _Nonnull info); 59 60 enum { 61 #if defined(__LP64__) 62 RTLD_NOW = 2, 63 #else 64 RTLD_NOW = 0, 65 #endif 66 RTLD_LAZY = 1, 67 68 RTLD_LOCAL = 0, 69 #if defined(__LP64__) 70 RTLD_GLOBAL = 0x00100, 71 #else 72 RTLD_GLOBAL = 2, 73 #endif 74 RTLD_NOLOAD = 4, 75 RTLD_NODELETE = 0x01000, 76 }; 77 78 #if defined (__LP64__) 79 #define RTLD_DEFAULT __BIONIC_CAST(reinterpret_cast, void*, 0) 80 #define RTLD_NEXT __BIONIC_CAST(reinterpret_cast, void*, -1L) 81 #else 82 #define RTLD_DEFAULT __BIONIC_CAST(reinterpret_cast, void*, 0xffffffff) 83 #define RTLD_NEXT __BIONIC_CAST(reinterpret_cast, void*, 0xfffffffe) 84 #endif 85 86 #if defined(__clang__) 87 #pragma clang diagnostic pop 88 #endif 89 90 __END_DECLS 91 92 #endif /* __DLFCN_H */ 93