1 /* 2 * Copyright (C) 2014 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 #ifndef __ANDROID_DLEXT_H__ 18 #define __ANDROID_DLEXT_H__ 19 20 #include <stddef.h> 21 #include <stdint.h> 22 #include <sys/cdefs.h> 23 24 __BEGIN_DECLS 25 26 /* bitfield definitions for android_dlextinfo.flags */ 27 enum { 28 /* When set, the reserved_addr and reserved_size fields must point to an 29 * already-reserved region of address space which will be used to load the 30 * library if it fits. If the reserved region is not large enough, the load 31 * will fail. 32 */ 33 ANDROID_DLEXT_RESERVED_ADDRESS = 0x1, 34 35 /* As DLEXT_RESERVED_ADDRESS, but if the reserved region is not large enough, 36 * the linker will choose an available address instead. 37 */ 38 ANDROID_DLEXT_RESERVED_ADDRESS_HINT = 0x2, 39 40 /* When set, write the GNU RELRO section of the mapped library to relro_fd 41 * after relocation has been performed, to allow it to be reused by another 42 * process loading the same library at the same address. This implies 43 * ANDROID_DLEXT_USE_RELRO. 44 */ 45 ANDROID_DLEXT_WRITE_RELRO = 0x4, 46 47 /* When set, compare the GNU RELRO section of the mapped library to relro_fd 48 * after relocation has been performed, and replace any relocated pages that 49 * are identical with a version mapped from the file. 50 */ 51 ANDROID_DLEXT_USE_RELRO = 0x8, 52 53 /* Instruct dlopen to use library_fd instead of opening file by name. 54 * The filename parameter is still used to identify the library. 55 */ 56 ANDROID_DLEXT_USE_LIBRARY_FD = 0x10, 57 58 /* Mask of valid bits */ 59 ANDROID_DLEXT_VALID_FLAG_BITS = ANDROID_DLEXT_RESERVED_ADDRESS | 60 ANDROID_DLEXT_RESERVED_ADDRESS_HINT | 61 ANDROID_DLEXT_WRITE_RELRO | 62 ANDROID_DLEXT_USE_RELRO | 63 ANDROID_DLEXT_USE_LIBRARY_FD, 64 }; 65 66 typedef struct { 67 uint64_t flags; 68 void* reserved_addr; 69 size_t reserved_size; 70 int relro_fd; 71 int library_fd; 72 } android_dlextinfo; 73 74 extern void* android_dlopen_ext(const char* filename, int flag, const android_dlextinfo* extinfo); 75 76 __END_DECLS 77 78 #endif /* __ANDROID_DLEXT_H__ */ 79