rui314 / mold

Mold: A Modern Linker 🦠
MIT License
14.21k stars 467 forks source link

[MachO] - Add support for objc_msgSend stubs #758

Open erneestoc opened 2 years ago

erneestoc commented 2 years ago

Support ObjC stubs:

[lld-macho] Add support for objc_msgSend stubs

Apple Clang in Xcode 14 introduced a new feature for reducing the overhead of objc_msgSend calls by deduplicating the setup calls for each individual selector. This works by clang adding undefined symbols for each selector called in a translation unit, such as _objc_msgSend$foo for calling the foo method on any NSObject. There are 2 different modes for this behavior, the default directly does the setup for _objc_msgSend and calls it, and the smaller option does the selector setup, and then calls the standard _objc_msgSend stub function.

The general overview of how this works is:

Undefined symbols with the given prefix are collected The suffix of each matching undefined symbol is added as a string to __objc_methname A pointer is added for every method name in the __objc_selrefs section A got entry is emitted for _objc_msgSend Stubs are emitting pointing to the synthesized locations

Source: https://reviews.llvm.org/D128108

nevack commented 1 year ago

Issue at LLVM https://github.com/llvm/llvm-project/issues/56034