You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[LLD][COFF] Add support for ARM64X same-address thunks
Fixes MSVC CRT thread-local constructors support on hybrid ARM64X targets.
-arm64xsameaddress is an undocumented option that ensures the specified
function has the same address in both native and EC views of hybrid images.
To achieve this, the linker emits additional thunks and replaces the symbols
of those functions with the thunk symbol (the same thunk is used in both
views). The thunk code jumps to the native function (similar to range
extension thunks), but additional ARM64X relocations are emitted to replace
the target with the EC function in the EC view.
MSVC appears to generate thunks even for non-hybrid ARM64EC images. As a side
effect, the native symbol is pulled in. Since this is used in the CRT for
thread-local constructors, it results in the image containing unnecessary
native code. Because these thunks do not appear to be useful in that context,
we limit this behavior to actual hybrid targets. This may change if
compatibility requires it.
The tricky part is that thunks should be skipped if the symbol is not live in
either view, and symbol replacement must be reflected in weak aliases. This
requires thunk generation to happen before resolving weak aliases but after the
GC pass. To enable this, the markLive call was moved earlier, and the final
weak alias resolution was postponed until afterward. This requires more code to
be aware of weak aliases, which previously could assume they were already
resolved.
0 commit comments