[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
This commit is contained in:
Nico Weber 2021-05-17 13:49:17 -04:00
parent 855b42ddd0
commit b4ead2c37b
2 changed files with 67 additions and 20 deletions

View File

@ -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);

View File

@ -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