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