[lld-macho] Prevent assertions for aliases to weak_def_can_be_hidden symbols
authorPaul Kirth <paulkirth@google.com>
Thu, 5 Jan 2023 20:32:25 +0000 (20:32 +0000)
committerPaul Kirth <paulkirth@google.com>
Mon, 9 Jan 2023 17:50:45 +0000 (17:50 +0000)
In https://reviews.llvm.org/D137982 we found that on Mach-O private
aliases could trigger an assert in lld when the aliasee was a
weak_def_can_be_hidden symbol.

This appears to be incorrect, and should be allowed in Mach-O.
Disallowing this behavior is also inconsistent with how ld64 handles
a private alias to weak_def_can_be_hidden symbols.

This patch removes the assert and tests that LLD handles such aliases
gracefully.

Reviewed By: #lld-macho, int3

Differential Revision: https://reviews.llvm.org/D141082

lld/MachO/InputFiles.cpp
lld/test/MachO/weak-def-can-be-hidden.s

index b7d3379..5a858c0 100644 (file)
@@ -698,8 +698,6 @@ static macho::Symbol *createDefined(const NList &sym, StringRef name,
         sym.n_desc & REFERENCED_DYNAMICALLY, sym.n_desc & N_NO_DEAD_STRIP,
         isWeakDefCanBeHidden);
   }
-  assert(!isWeakDefCanBeHidden &&
-         "weak_def_can_be_hidden on already-hidden symbol?");
   bool includeInSymtab = !isPrivateLabel(name) && !isEhFrameSection(isec);
   return make<Defined>(
       name, isec->getFile(), isec, value, size, sym.n_desc & N_WEAK_DEF,
index 4552582..091ad61 100644 (file)
@@ -116,6 +116,10 @@ _foo:
 _foo:
   retq
 
+# An alias is the only way to set .weak_def_can_be_hidden on an already-hidden symbol.
+# Veryify that LLD can handle these double-hidden symbols gracefully.
+.set l_foo, _foo
+
 #--- weak-foo-pe.s
 .private_extern _foo
 .globl _foo