summaryrefslogtreecommitdiff
path: root/clang/lib/AST/MicrosoftMangle.cpp
diff options
context:
space:
mode:
authorJoshua Haberman <jhaberman@gmail.com>2025-11-21 17:03:40 -0800
committerGitHub <noreply@github.com>2025-11-21 20:03:40 -0500
commit58e2dde45f775328b71b532e65762a9696ccccbd (patch)
tree5b5fbf7ecabceed71eadca52a635497041c5834b /clang/lib/AST/MicrosoftMangle.cpp
parent99120bb51bf728d7ba7fad5068227f8c6e707159 (diff)
[lld:MachO] Allow independent override of weak symbols aliased via .set (#167825)
Currently, if multiple external weak symbols are defined at the same address in an object file (e.g., by using the .set assembler directive to alias them to a single weak variable), ld64.lld treats them as a single unit. When any one of these symbols is overridden by a strong definition, all of the original weak symbols resolve to the strong definition. This patch changes the behavior in `transplantSymbolsAtOffset`. When a weak symbol is being replaced by a strong one, only non-external (local) symbols at the same offset are moved to the new symbol's section. Other *external* symbols are no longer transplanted. This allows each external weak symbol to be overridden independently. This behavior is consistent with Apple's ld-classic, but diverges from ld-prime in one case, as noted on https://github.com/llvm/llvm-project/issues/167262 (this discrepancy has recently been reported to Apple). ### Backward Compatibility This change alters linker behavior for a specific scenario. The creation of multiple external weak symbols aliased to the same address via assembler directives is primarily an advanced technique. It's unlikely that existing builds rely on the current behavior of all aliases being overridden together. If there are concerns, this could be put behind a linker option, but the new default seems more correct, less surprising, and is consistent with ld-classic. ### Testing The new lit test `test/MachO/weak-alias-override.s` verifies this behavior using llvm-nm. Fixes #167262
Diffstat (limited to 'clang/lib/AST/MicrosoftMangle.cpp')
0 files changed, 0 insertions, 0 deletions