Allow sharing the RELRO section via a file.
Add flags and a file descriptor to android_dlopen_ext() to allow writing the RELRO section of the loaded library to a file after relocation processing, and to allow mapping identical pages from the file over the top of relocated memory in another process. Explicitly comparing the pages is required in case a page contains a reference to a symbol defined in another library loaded at a random base address. Bug: 13005501 Change-Id: Ibb5b2d384edfaa5acf3e97a5f8b6115c10497a1e
This commit is contained in:
@@ -36,15 +36,31 @@ enum {
|
||||
*/
|
||||
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,
|
||||
|
||||
/* Mask of valid bits */
|
||||
ANDROID_DLEXT_VALID_FLAG_BITS = ANDROID_DLEXT_RESERVED_ADDRESS |
|
||||
ANDROID_DLEXT_RESERVED_ADDRESS_HINT,
|
||||
ANDROID_DLEXT_RESERVED_ADDRESS_HINT |
|
||||
ANDROID_DLEXT_WRITE_RELRO |
|
||||
ANDROID_DLEXT_USE_RELRO,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
int flags;
|
||||
void* reserved_addr;
|
||||
size_t reserved_size;
|
||||
int relro_fd;
|
||||
} android_dlextinfo;
|
||||
|
||||
extern void* android_dlopen_ext(const char* filename, int flag, const android_dlextinfo* extinfo);
|
||||
|
Reference in New Issue
Block a user