动态链接器

摘要

枚举

匿名枚举 25{
  ANDROID_DLEXT_RESERVED_ADDRESS = 0x1,
  ANDROID_DLEXT_RESERVED_ADDRESS_HINT = 0x2,
  ANDROID_DLEXT_WRITE_RELRO = 0x4,
  ANDROID_DLEXT_USE_RELRO = 0x8,
  ANDROID_DLEXT_USE_LIBRARY_FD = 0x10,
  ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET = 0x20,
  ANDROID_DLEXT_FORCE_LOAD = 0x40,
  ANDROID_DLEXT_USE_NAMESPACE = 0x200,
  ANDROID_DLEXT_RESERVED_ADDRESS_RECURSIVE = 0x400,
  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 | ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET | ANDROID_DLEXT_FORCE_LOAD | ANDROID_DLEXT_USE_NAMESPACE | ANDROID_DLEXT_RESERVED_ADDRESS_RECURSIVE
}
枚举
android_dlextinfo::flags 的位字段定义。

函数

android_dlopen_ext(const char *_Nullable __filename, int __flags, const android_dlextinfo *_Nullable __info)
void *_Nullable
打开指定的库。

结构体

android_dlextinfo

用于将特定于 Android 的参数传递给 android_dlopen_ext()

枚举

匿名枚举 25

android/dlext.h 中声明
 Anonymous Enum 25

android_dlextinfo::flags 的位字段定义。

属性
ANDROID_DLEXT_FORCE_LOAD

设置时,不使用 stat(2) 检查库是否已加载。

此标志允许在某些 ELF 文件共享同一文件名时强制加载库(例如,已加载的库已被移除并覆盖)。

请注意,如果库与旧库具有相同的 DT_SONAME,并且其他一些库在其 DT_NEEDED 列表中包含该 soname,则第一个库将用于解析所有依赖项。

ANDROID_DLEXT_RESERVED_ADDRESS

设置时,reserved_addrreserved_size 字段必须指向已保留的地址空间区域,如果库符合要求,将使用此区域加载库。

如果保留区域不够大,加载将失败。

ANDROID_DLEXT_RESERVED_ADDRESS_HINT

ANDROID_DLEXT_RESERVED_ADDRESS 类似,但如果保留区域不够大,链接器将选择一个可用地址。

ANDROID_DLEXT_RESERVED_ADDRESS_RECURSIVE

指示 dlopen() 将 ANDROID_DLEXT_RESERVED_ADDRESSANDROID_DLEXT_RESERVED_ADDRESS_HINTANDROID_DLEXT_WRITE_RELROANDROID_DLEXT_USE_RELRO 应用于作为主库依赖项加载的任何库。

这意味着如果主库依赖于一个或多个尚未加载的库,它们将依次加载到从 reserved_addr 开始的区域中,并且 reserved_size 必须足够大以包含所有库。这些库将以从 DT_NEEDED 条目构建的确定性顺序加载,而不是默认使用的更安全的随机顺序。

每个库的 GNU RELRO 部分将按照加载顺序写入 relro_fd。这意味着结果文件取决于哪些库已加载,因为只会包含新加载的库,而不会包含任何已加载的依赖项。调用者应确保新加载的库集是一致的,以便此操作生效。

这主要适用于系统 WebView 实现。

ANDROID_DLEXT_USE_LIBRARY_FD

使用 library_fd 代替按名称打开文件。

文件名参数仍用于标识库。

ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET

如果使用 library_fd 打开库,则从 library_fd_offset 开始读取。

这主要用于加载存储在另一个文件中的库(例如 ZIP 归档文件中未压缩的库)。此标志仅在设置了 ANDROID_DLEXT_USE_LIBRARY_FD 时有效。

ANDROID_DLEXT_USE_NAMESPACE

此标志用于在不同的命名空间中加载库。

命名空间在 library_namespace 中指定。

此标志仅供内部使用(因为没有用于命名空间的 NDK API)。

ANDROID_DLEXT_USE_RELRO

设置时,在执行重定位后,将映射库的 GNU RELRO 部分与 relro_fd 进行比较,并将任何与文件映射版本相同的重定位页面替换掉。

这主要适用于系统 WebView 实现。

ANDROID_DLEXT_VALID_FLAG_BITS

有效位的掩码。

ANDROID_DLEXT_WRITE_RELRO

设置时,在执行重定位后,将映射库的 GNU RELRO 部分写入 relro_fd,以便可以在同一地址被加载同一库的其他进程重用。

这暗示着设置 ANDROID_DLEXT_USE_RELRO

这主要适用于系统 WebView 实现。

函数

android_dlopen_ext

android/dlext.h 中声明
void *_Nullable android_dlopen_ext(
  const char *_Nullable __filename,
  int __flags,
  const android_dlextinfo *_Nullable __info
)

打开指定的库。

__filename__flags 参数与 dlopen(3) 的参数相同,特定于 Android 的标志通过 __infoflags 成员提供。