// 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 #include /* 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_