dlext.h revision 9b82136b987bc01224e3b42732334ea27c97d188
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#include <sys/types.h>  /* for off64_t */
24
25__BEGIN_DECLS
26
27/* bitfield definitions for android_dlextinfo.flags */
28enum {
29  /* When set, the reserved_addr and reserved_size fields must point to an
30   * already-reserved region of address space which will be used to load the
31   * library if it fits. If the reserved region is not large enough, the load
32   * will fail.
33   */
34  ANDROID_DLEXT_RESERVED_ADDRESS      = 0x1,
35
36  /* As DLEXT_RESERVED_ADDRESS, but if the reserved region is not large enough,
37   * the linker will choose an available address instead.
38   */
39  ANDROID_DLEXT_RESERVED_ADDRESS_HINT = 0x2,
40
41  /* When set, write the GNU RELRO section of the mapped library to relro_fd
42   * after relocation has been performed, to allow it to be reused by another
43   * process loading the same library at the same address. This implies
44   * ANDROID_DLEXT_USE_RELRO.
45   */
46  ANDROID_DLEXT_WRITE_RELRO           = 0x4,
47
48  /* When set, compare the GNU RELRO section of the mapped library to relro_fd
49   * after relocation has been performed, and replace any relocated pages that
50   * are identical with a version mapped from the file.
51   */
52  ANDROID_DLEXT_USE_RELRO             = 0x8,
53
54  /* Instruct dlopen to use library_fd instead of opening file by name.
55   * The filename parameter is still used to identify the library.
56   */
57  ANDROID_DLEXT_USE_LIBRARY_FD        = 0x10,
58
59  /* If opening a library using library_fd read it starting at library_fd_offset.
60   * This flag is only valid when ANDROID_DLEXT_USE_LIBRARY_FD is set.
61   */
62  ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET    = 0x20,
63
64  /* When set, do not check if the library has already been loaded by file stat(2)s.
65   *
66   * This flag allows forced loading of the library in the case when for some
67   * reason multiple ELF files share the same filename (because the already-loaded
68   * library has been removed and overwritten, for example).
69   *
70   * Note that if the library has the same dt_soname as an old one and some other
71   * library has the soname in DT_NEEDED list, the first one will be used to resolve any
72   * dependencies.
73   */
74  ANDROID_DLEXT_FORCE_LOAD = 0x40,
75
76  /* Mask of valid bits */
77  ANDROID_DLEXT_VALID_FLAG_BITS       = ANDROID_DLEXT_RESERVED_ADDRESS |
78                                        ANDROID_DLEXT_RESERVED_ADDRESS_HINT |
79                                        ANDROID_DLEXT_WRITE_RELRO |
80                                        ANDROID_DLEXT_USE_RELRO |
81                                        ANDROID_DLEXT_USE_LIBRARY_FD |
82                                        ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET |
83                                        ANDROID_DLEXT_FORCE_LOAD,
84};
85
86typedef struct {
87  uint64_t flags;
88  void*   reserved_addr;
89  size_t  reserved_size;
90  int     relro_fd;
91  int     library_fd;
92  off64_t library_fd_offset;
93} android_dlextinfo;
94
95extern void* android_dlopen_ext(const char* filename, int flag, const android_dlextinfo* extinfo);
96
97__END_DECLS
98
99#endif /* __ANDROID_DLEXT_H__ */
100