| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Definitions for android_dlopen_ext(). |
| // |
| // This function was added for Android L-MR1 and made available in android-21 |
| // but we currently build Chromium with android-16. Placing the declarations |
| // we need here allows code that uses android_dlopen_ext() to build with |
| // android-16. At runtime we check the target's SDK_INT to ensure that we |
| // are on a system new enough to offer this function, and also only access |
| // it with dlsym so that the runtime linker on pre-Android L-MR1 targets will |
| // not complain about a missing symbol when loading our library. |
| // |
| // Details below taken from: |
| // third_party/android_tools/ndk/platforms/android-21 |
| // /arch-arm/usr/include/android/dlext.h |
| // |
| // Although taken specifically from arch-arm, there are no architecture- |
| // specific elements in dlext.h. All android-21/arch-* directories contain |
| // identical copies of dlext.h. |
| |
| #ifndef BASE_ANDROID_LINKER_ANDROID_DLEXT_H_ |
| #define BASE_ANDROID_LINKER_ANDROID_DLEXT_H_ |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| /* bitfield definitions for android_dlextinfo.flags */ |
| enum { |
| /* When set, the reserved_addr and reserved_size fields must point to an |
| * already-reserved region of address space which will be used to load the |
| * library if it fits. If the reserved region is not large enough, the load |
| * will fail. |
| */ |
| ANDROID_DLEXT_RESERVED_ADDRESS = 0x1, |
| |
| /* As DLEXT_RESERVED_ADDRESS, but if the reserved region is not large enough, |
| * the linker will choose an available address instead. |
| */ |
| ANDROID_DLEXT_RESERVED_ADDRESS_HINT = 0x2, |
| |
| /* When set, write the GNU RELRO section of the mapped library to relro_fd |
| * after relocation has been performed, to allow it to be reused by another |
| * process loading the same library at the same address. This implies |
| * ANDROID_DLEXT_USE_RELRO. |
| */ |
| ANDROID_DLEXT_WRITE_RELRO = 0x4, |
| |
| /* When set, compare the GNU RELRO section of the mapped library to relro_fd |
| * after relocation has been performed, and replace any relocated pages that |
| * are identical with a version mapped from the file. |
| */ |
| ANDROID_DLEXT_USE_RELRO = 0x8, |
| |
| /* Instruct dlopen to use library_fd instead of opening file by name. |
| * The filename parameter is still used to identify the library. |
| */ |
| ANDROID_DLEXT_USE_LIBRARY_FD = 0x10, |
| |
| /* Mask of valid bits */ |
| ANDROID_DLEXT_VALID_FLAG_BITS = ANDROID_DLEXT_RESERVED_ADDRESS | |
| ANDROID_DLEXT_RESERVED_ADDRESS_HINT | |
| ANDROID_DLEXT_WRITE_RELRO | |
| ANDROID_DLEXT_USE_RELRO | |
| ANDROID_DLEXT_USE_LIBRARY_FD, |
| }; |
| |
| typedef struct { |
| uint64_t flags; |
| void* reserved_addr; |
| size_t reserved_size; |
| int relro_fd; |
| int library_fd; |
| } android_dlextinfo; |
| |
| #endif // BASE_ANDROID_LINKER_ANDROID_DLEXT_H_ |