# Dynamic Linker

## Summary

| ### Enumerations ||
|---|---|
| `https://developer.android.com/ndk/reference/group/libdl#group__libdl_1ga7ff5f2dff38e7639981794c43dc9167b{ https://developer.android.com/ndk/reference/group/libdl#group__libdl_1gga7ff5f2dff38e7639981794c43dc9167ba21ec7fd04aa6689b157ddb69d87d0182 = 0x1, https://developer.android.com/ndk/reference/group/libdl#group__libdl_1gga7ff5f2dff38e7639981794c43dc9167ba46236d7ec674eadd73b0f6a07ca77b33 = 0x2, https://developer.android.com/ndk/reference/group/libdl#group__libdl_1gga7ff5f2dff38e7639981794c43dc9167ba2fa56c9ba2e5a17986715ec1e33332b6 = 0x4, https://developer.android.com/ndk/reference/group/libdl#group__libdl_1gga7ff5f2dff38e7639981794c43dc9167ba7fbe91bb122939cde648894320e6bce5 = 0x8, https://developer.android.com/ndk/reference/group/libdl#group__libdl_1gga7ff5f2dff38e7639981794c43dc9167ba53205223c7afad9e6c1f80f51ff07d27 = 0x10, https://developer.android.com/ndk/reference/group/libdl#group__libdl_1gga7ff5f2dff38e7639981794c43dc9167ba5da222786c072e9be399d1ba012505ea = 0x20, https://developer.android.com/ndk/reference/group/libdl#group__libdl_1gga7ff5f2dff38e7639981794c43dc9167ba5c9fc18ea5d3e1b3bf8d3092c0389113 = 0x40, https://developer.android.com/ndk/reference/group/libdl#group__libdl_1gga7ff5f2dff38e7639981794c43dc9167ba683325e8fe5e719c3807bff4f7dea8b1 = 0x200, https://developer.android.com/ndk/reference/group/libdl#group__libdl_1gga7ff5f2dff38e7639981794c43dc9167bac80b18b5cc0208b546aa65c93f3a0b20 = 0x400, https://developer.android.com/ndk/reference/group/libdl#group__libdl_1gga7ff5f2dff38e7639981794c43dc9167ba8fa2f27e407b95becff5b46d1d71a5cb = ANDROID_DLEXT_RESERVED_ADDRESS | ANDROID_DLEXT_RESERVED_ADDRESS_HINT | ANDROID_DLEXT_WRITE_RELRO | ANDROID_DLEXT_USE_RELRO | ANDROID_DLEXT_USE_LIBRARY_FD | ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET | ANDROID_DLEXT_FORCE_LOAD | ANDROID_DLEXT_USE_NAMESPACE | ANDROID_DLEXT_RESERVED_ADDRESS_RECURSIVE }` | enumBitfield definitions for `https://developer.android.com/ndk/reference/structandroid/dlextinfo#structandroid__dlextinfo_1ac233212fa6b6852e2b966a3feae38e63`. |

| ### Functions ||
|---|---|
| `https://developer.android.com/ndk/reference/group/libdl#group__libdl_1ga30dee587d0ce38e881572a1e5a99f17c(const char *https://developer.android.com/ndk/reference/group/ndk-binder#group___ndk_binder_1ga0890a8f74983b96e76f6b8748543032d __filename, int __flags, const https://developer.android.com/ndk/reference/structandroid/dlextinfo#structandroid__dlextinfo *https://developer.android.com/ndk/reference/group/ndk-binder#group___ndk_binder_1ga0890a8f74983b96e76f6b8748543032d __info)` | `void *https://developer.android.com/ndk/reference/group/ndk-binder#group___ndk_binder_1ga0890a8f74983b96e76f6b8748543032d` Opens the given library. |

| ### Structs ||
|---|---|
| [android_dlextinfo](https://developer.android.com/ndk/reference/structandroid/dlextinfo) | Used to pass Android-specific arguments to [android_dlopen_ext()](https://developer.android.com/ndk/reference/group/libdl#group__libdl_1ga30dee587d0ce38e881572a1e5a99f17c). |

## Enumerations

### Anonymous Enum 26

Declared in `android/dlext.h`

```
 Anonymous Enum 26
```
Bitfield definitions for `https://developer.android.com/ndk/reference/structandroid/dlextinfo#structandroid__dlextinfo_1ac233212fa6b6852e2b966a3feae38e63`.

| Properties ||
|---|---|
| `ANDROID_DLEXT_FORCE_LOAD` | When set, do not use `stat(2)` to check if the library has already been loaded. This flag allows forced loading of the library in the case when for some reason multiple ELF files share the same filename (because the already-loaded library has been removed and overwritten, for example). Note that if the library has the same `DT_SONAME` as an old one and some other library has the soname in its `DT_NEEDED` list, the first one will be used to resolve any dependencies. |
| `ANDROID_DLEXT_RESERVED_ADDRESS` | 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, loading will fail. |
| `ANDROID_DLEXT_RESERVED_ADDRESS_HINT` | Like `ANDROID_DLEXT_RESERVED_ADDRESS`, but if the reserved region is not large enough, the linker will choose an available address instead. |
| `ANDROID_DLEXT_RESERVED_ADDRESS_RECURSIVE` | Instructs dlopen() to apply `ANDROID_DLEXT_RESERVED_ADDRESS`, `ANDROID_DLEXT_RESERVED_ADDRESS_HINT`, `ANDROID_DLEXT_WRITE_RELRO` and `ANDROID_DLEXT_USE_RELRO` to any libraries loaded as dependencies of the main library as well. This means that if the main library depends on one or more not-already-loaded libraries, they will be loaded consecutively into the region starting at `reserved_addr`, and `reserved_size` must be large enough to contain all of the libraries. The libraries will be loaded in the deterministic order constructed from the DT_NEEDED entries, rather than the more secure random order used by default. Each library's GNU RELRO sections will be written out to `relro_fd` in the same order they were loaded. This will mean that the resulting file is dependent on which of the libraries were already loaded, as only the newly loaded libraries will be included, not any already-loaded dependencies. The caller should ensure that the set of libraries newly loaded is consistent for this to be effective. This is mainly useful for the system WebView implementation. |
| `ANDROID_DLEXT_USE_LIBRARY_FD` | Use `library_fd` instead of opening the file by name. The filename parameter is still used to identify the library. |
| `ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET` | If opening a library using `library_fd` read it starting at `library_fd_offset`. This is mainly useful for loading a library stored within another file (such as uncompressed inside a ZIP archive). This flag is only valid when `ANDROID_DLEXT_USE_LIBRARY_FD` is set. |
| `ANDROID_DLEXT_USE_NAMESPACE` | This flag used to load library in a different namespace. The namespace is specified in `library_namespace`. This flag is for internal use only (since there is no NDK API for namespaces). |
| `ANDROID_DLEXT_USE_RELRO` | 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. This is mainly useful for the system WebView implementation. |
| `ANDROID_DLEXT_VALID_FLAG_BITS` | Mask of valid bits. |
| `ANDROID_DLEXT_WRITE_RELRO` | 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`. This is mainly useful for the system WebView implementation. |

## Functions

### android_dlopen_ext

Declared in `android/dlext.h`

```
void *_Nullable android_dlopen_ext(
  const char *_Nullable __filename,
  int __flags,
  const android_dlextinfo *_Nullable __info
)
```
Opens the given library.

The `__filename` and `__flags` arguments are the same as for [dlopen(3)](https://man7.org/linux/man-pages/man3/dlopen.3.html), with the Android-specific flags supplied via the `flags` member of `__info`.