什么环境变量控制dyld?

What environment variables control dyld?

有很多环境变量可以控制 dyld 的启动,其中一些对于调试性能问题非常有用。并非所有这些都被记录在案。

这些在 dyld 手册页中有解释(至少在 macOS 10.13 上)

DYLD_FRAMEWORK_PATH
DYLD_FALLBACK_FRAMEWORK_PATH
DYLD_VERSIONED_FRAMEWORK_PATH
DYLD_LIBRARY_PATH
DYLD_FALLBACK_LIBRARY_PATH
DYLD_VERSIONED_LIBRARY_PATH
DYLD_PRINT_TO_FILE
DYLD_SHARED_REGION
DYLD_INSERT_LIBRARIES
DYLD_FORCE_FLAT_NAMESPACE
DYLD_IMAGE_SUFFIX
DYLD_PRINT_OPTS
DYLD_PRINT_ENV
DYLD_PRINT_LIBRARIES
DYLD_BIND_AT_LAUNCH
DYLD_DISABLE_DOFS
DYLD_PRINT_APIS
DYLD_PRINT_BINDINGS
DYLD_PRINT_INITIALIZERS
DYLD_PRINT_REBASINGS
DYLD_PRINT_SEGMENTS
DYLD_PRINT_STATISTICS
DYLD_PRINT_DOFS
DYLD_PRINT_RPATHS
DYLD_SHARED_CACHE_DIR
DYLD_SHARED_CACHE_DONT_VALIDATE

这个记录在 man dyld 中,但没有列在顶部的列表中:

DYLD_PRINT_STATISTICS_DETAILS

这些是未记录的:

DYLD_ROOT_PATH
DYLD_PATHS_ROOT
DYLD_DISABLE_PREFETCH
DYLD_PRINT_LIBRARIES_POST_LAUNCH
DYLD_NEW_LOCAL_SHARED_REGIONS
DYLD_NO_FIX_PREBINDING
DYLD_PREBIND_DEBUG
DYLD_PRINT_TO_STDERR
DYLD_PRINT_WEAK_BINDINGS
DYLD_PRINT_WARNINGS
DYLD_PRINT_CS_NOTIFICATIONS
DYLD_PRINT_INTERPOSING
DYLD_PRINT_CODE_SIGNATURES
DYLD_USE_CLOSURES
DYLD_IGNORE_PREBINDING
DYLD_SKIP_MAIN

DYLD_ROOT_PATHDYLD_PATHS_ROOT 似乎是同义词,允许您重置 "root" 以搜索 libraries/frameworks/etc。这在 macOS/iPhoneSimulator 上可用,但在 iOS 上不可用。

DYLD_DISABLE_PREFETCH 禁用 __DATA 和 __LINKEDIT 段内容的预取。

DYLD_PRINT_LIBRARIES_POST_LAUNCH 与 DYLD_PRINT_LIBRARIES 相同,但在启动完成后立即打印。

DYLD_NEW_LOCAL_SHARED_REGIONSDYLD_NO_FIX_PREBINDING 被忽略,不再做任何事情。

DYLD_PREBIND_DEBUG 打印出关于为什么没有使用预绑定的调试信息。

DYLD_PRINT_TO_STDERR 仅适用于 iOS 并强制输出到 stderr(而不是 stdout)以帮助它显示在控制台日志中。

DYLD_PRINT_WEAK_BINDINGS 打印弱绑定的调试信息。

DYLD_PRINT_WARNINGS 打印一堆警告(主要是关于闭包及其使用方式)。

DYLD_PRINT_CS_NOTIFICATIONS 打印有关核心符号的信息。

DYLD_PRINT_INTERPOSING 打印有关发生的插入的详细信息。

DYLD_PRINT_CODE_SIGNATURES 打印有关代码签名的详细信息(特别是成功和失败)。

DYLD_USE_CLOSURES 是 dyld3 的一项功能,但似乎不适用于任何非内部人员(需要 CSR_ALLOW_APPLE_INTERNAL 设置)。

DYLD_IGNORE_PREBINDING 具有三个值("all"、"app"、"nonsplit"),如果未提供值,则不拆分为默认值。

DYLD_SKIP_MAIN 是苹果独有的功能,用于测试 dyld(需要 CSR_ALLOW_APPLE_INTERNAL 设置)。