[lld] b4ead2c - [lld/mac] Correctly set nextdefsym
Nico Weber via llvm-commits
llvm-commits at lists.llvm.org
Tue May 18 10:54:33 PDT 2021
Author: Nico Weber
Date: 2021-05-18T13:53:55-04:00
New Revision: b4ead2c37bcbb1f81919c68e2a2a227aac90f07c
URL: https://github.com/llvm/llvm-project/commit/b4ead2c37bcbb1f81919c68e2a2a227aac90f07c
DIFF: https://github.com/llvm/llvm-project/commit/b4ead2c37bcbb1f81919c68e2a2a227aac90f07c.diff
LOG: [lld/mac] Correctly set nextdefsym
In LC_DYSYMTAB, private externs were still emitted as exported symbols instead
of as locals.
Fixes PR50373. See bug for details.
Differential Revision: https://reviews.llvm.org/D102662
Added:
Modified:
lld/MachO/SyntheticSections.cpp
lld/test/MachO/symtab.s
Removed:
################################################################################
diff --git a/lld/MachO/SyntheticSections.cpp b/lld/MachO/SyntheticSections.cpp
index 38c93e1f8f96c..f0070fe48e697 100644
--- a/lld/MachO/SyntheticSections.cpp
+++ b/lld/MachO/SyntheticSections.cpp
@@ -753,7 +753,10 @@ void SymtabSection::finalizeContents() {
if (!defined->includeInSymtab)
continue;
assert(defined->isExternal());
- addSymbol(externalSymbols, defined);
+ if (defined->privateExtern)
+ addSymbol(localSymbols, defined);
+ else
+ addSymbol(externalSymbols, defined);
} else if (auto *dysym = dyn_cast<DylibSymbol>(sym)) {
if (dysym->isReferenced())
addSymbol(undefinedSymbols, sym);
diff --git a/lld/test/MachO/symtab.s b/lld/test/MachO/symtab.s
index 2a23b3fb77f28..a2232c93f9ffc 100644
--- a/lld/test/MachO/symtab.s
+++ b/lld/test/MachO/symtab.s
@@ -1,9 +1,10 @@
# REQUIRES: x86
# RUN: rm -rf %t && split-file %s %t
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test2.s -o %t/test2.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/libfoo.s -o %t/libfoo.o
# RUN: %lld -dylib %t/libfoo.o -o %t/libfoo.dylib
-# RUN: %lld -lSystem %t/test.o %t/libfoo.dylib -o %t/test
+# RUN: %lld -lSystem %t/test.o %t/test2.o %t/libfoo.dylib -o %t/test
# RUN: llvm-readobj --syms --macho-dysymtab %t/test | FileCheck %s
# CHECK: Symbols [
@@ -26,6 +27,26 @@
# CHECK-NEXT: Value: 0x1{{[0-9a-f]*}}
# CHECK-NEXT: }
# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: _private_external
+# CHECK-NEXT: PrivateExtern
+# CHECK-NEXT: Type: Section (0xE)
+# CHECK-NEXT: Section: __text (0x1)
+# CHECK-NEXT: RefType: UndefinedNonLazy (0x0)
+# CHECK-NEXT: Flags [ (0x0)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Value: 0x1{{[0-9a-f]*}}
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: _private_external_weak
+# CHECK-NEXT: PrivateExtern
+# CHECK-NEXT: Type: Section (0xE)
+# CHECK-NEXT: Section: __text (0x1)
+# CHECK-NEXT: RefType: UndefinedNonLazy (0x0)
+# CHECK-NEXT: Flags [ (0x0)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Value: 0x1{{[0-9a-f]*}}
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
# CHECK-NEXT: Name: _main
# CHECK-NEXT: Extern
# CHECK-NEXT: Type: Section (0xE)
@@ -56,17 +77,17 @@
# CHECK-NEXT: ]
# CHECK-NEXT: Value: 0x1{{[0-9a-f]*}}
# CHECK-NEXT: }
-# CHECK-NEXT: Symbol {
-# CHECK-NEXT: Name: __mh_execute_header (81)
-# CHECK-NEXT: Extern
-# CHECK-NEXT: Type: Section (0xE)
-# CHECK-NEXT: Section: __text (0x1)
-# CHECK-NEXT: RefType: UndefinedNonLazy (0x0)
-# CHECK-NEXT: Flags [ (0x10)
-# CHECK-NEXT: ReferencedDynamically (0x10)
-# CHECK-NEXT: ]
-# CHECK-NEXT: Value: 0x100000000
-# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: __mh_execute_header
+# CHECK-NEXT: Extern
+# CHECK-NEXT: Type: Section (0xE)
+# CHECK-NEXT: Section: __text (0x1)
+# CHECK-NEXT: RefType: UndefinedNonLazy (0x0)
+# CHECK-NEXT: Flags [ (0x10)
+# CHECK-NEXT: ReferencedDynamically (0x10)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Value: 0x100000000
+# CHECK-NEXT: }
# CHECK-NEXT: Symbol {
# CHECK-NEXT: Name: dyld_stub_binder
# CHECK-NEXT: Extern
@@ -92,10 +113,10 @@
# CHECK-NEXT: ]
# CHECK-NEXT: Dysymtab {
# CHECK-NEXT: ilocalsym: 0
-# CHECK-NEXT: nlocalsym: 2
-# CHECK-NEXT: iextdefsym: 2
+# CHECK-NEXT: nlocalsym: 4
+# CHECK-NEXT: iextdefsym: 4
# CHECK-NEXT: nextdefsym: 4
-# CHECK-NEXT: iundefsym: 6
+# CHECK-NEXT: iundefsym: 8
# CHECK-NEXT: nundefsym: 2
## Verify that the first entry in the StringTable is a space, and that
@@ -110,20 +131,43 @@
_dynamic:
#--- test.s
-.globl _main, _external, _external_weak, _unreferenced
+.globl _main, _external, _private_external, _external_weak, _private_external_weak, _unreferenced
.data
_external:
- .space 0
+ .space 1
_local:
- .space 0
+ .space 1
.text
.weak_definition _external_weak
_external_weak:
- .space 0
+ .space 1
+
+.private_extern _private_external
+_private_external:
+ .space 1
+
+.weak_definition _private_external_weak
+.private_extern _private_external_weak
+_private_external_weak:
+ .space 1
_main:
+ callq _private_external
callq _dynamic
mov $0, %rax
ret
+
+#--- test2.s
+## These are both already in test.s and should make it into the symbol table
+## just once.
+.globl _external_weak, _private_external_weak
+.text
+.weak_definition _external_weak
+_external_weak:
+ .space 1
+.weak_definition _private_external_weak
+.private_extern _private_external_weak
+_private_external_weak:
+ .space 1
More information about the llvm-commits
mailing list