Faster App Launching in iOS 15 and Monterey
All programs and
dylibs
built with a deployment target of macOS 12 or iOS 15 or later now use the chained fixups format. This uses different load commands and LINKEDIT data, and won’t run or load on older OS versions.
The app binary is broken into segments which each contain a chain of fixups that can be either binds or rebases (there are no more lazy binds). Each 64 bit rebase location in the binary now encodes the offset it points to as well as the offset to the next fixup[…]
[…]
This very compact encoding means the entire process of walking the chain can be contained within the existing size of the binary. In my tests over 50% of dyld data’s contribution to binary size is saved since only a small amount of metadata is reserved to indicate the first fixup on each page. The end result was an over 1mb size reduction for large Swift apps.
[…]
[The] chained fixups group all changes for each memory page together. Dyld can now process them faster with one pass through memory, completing rebases and binds at the same time. This allows OS features like the memory compressor to take advantage of the well known ordering, not needing to go back and decompress old pages during binding.
Previously:
- Rewriting the Uber App in Swift
- Optimizing the Objective-C Runtime in Big Sur
- Optimizing Global Constant Data Structures Using Relative References
- Using Static Frameworks to Speed Up Launching
Update (2021-07-06): See also: Hacker News.