Index: lld/MachO/SyntheticSections.cpp =================================================================== --- lld/MachO/SyntheticSections.cpp +++ lld/MachO/SyntheticSections.cpp @@ -1104,8 +1104,12 @@ } static uint32_t indirectValue(const Symbol *sym) { - return sym->symtabIndex != UINT32_MAX ? sym->symtabIndex - : INDIRECT_SYMBOL_LOCAL; + if (sym->symtabIndex == UINT32_MAX) + return INDIRECT_SYMBOL_LOCAL; + if (auto *defined = dyn_cast(sym)) + if (defined->privateExtern) + return INDIRECT_SYMBOL_LOCAL; + return sym->symtabIndex; } void IndirectSymtabSection::writeTo(uint8_t *buf) const { Index: lld/test/MachO/compact-unwind-both-local-and-dylib-personality.s =================================================================== --- lld/test/MachO/compact-unwind-both-local-and-dylib-personality.s +++ lld/test/MachO/compact-unwind-both-local-and-dylib-personality.s @@ -33,12 +33,13 @@ # A: Indirect symbols for (__DATA_CONST,__got) # A-NEXT: address index name # A-DAG: 0x[[#%x,GXX_PERSONALITY_LO:]] [[#]] ___gxx_personality_v0 -# A-DAG: 0x[[#%x,GXX_PERSONALITY_HI:]] [[#]] ___gxx_personality_v0 +# A-DAG: 0x[[#%x,GXX_PERSONALITY_HI:]] [[#]] ___gxx_personality_v0 # A-DAG: 0x[[#%x,PERSONALITY_1:]] LOCAL # A-DAG: 0x[[#%x,PERSONALITY_2:]] LOCAL # BC: Indirect symbols for (__DATA_CONST,__got) # BC-NEXT: address index name +# BC-DAG: 0x[[#%x,GXX_PERSONALITY_HI:]] LOCAL # BC-DAG: 0x[[#%x,GXX_PERSONALITY_LO:]] LOCAL # BC-DAG: 0x[[#%x,PERSONALITY_1:]] LOCAL # BC-DAG: 0x[[#%x,PERSONALITY_2:]] LOCAL Index: lld/test/MachO/indirect-symtab.s =================================================================== --- lld/test/MachO/indirect-symtab.s +++ lld/test/MachO/indirect-symtab.s @@ -2,8 +2,9 @@ # RUN: rm -rf %t; split-file %s %t # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/libfoo.s -o %t/libfoo.o # 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/bar.s -o %t/bar.o # RUN: %lld -dylib %t/libfoo.o -o %t/libfoo.dylib -lSystem -# RUN: %lld %t/test.o %t/libfoo.dylib -o %t/test -lSystem +# RUN: %lld %t/test.o %t/bar.o %t/libfoo.dylib -o %t/test -lSystem # RUN: llvm-objdump --macho -d --no-show-raw-insn --indirect-symbols %t/test | FileCheck %s # RUN: llvm-otool -l %t/test | FileCheck --check-prefix=DYSYMTAB %s @@ -11,6 +12,8 @@ # CHECK-NEXT: _main: # CHECK-NEXT: movq {{.*}}(%rip), %rax ## literal pool symbol address: _foo # CHECK-NEXT: movq {{.*}}(%rip), %rax ## literal pool symbol address: _bar +# CHECK-NEXT: leaq _baz(%rip), %rax +# CHECK-NEXT: addq {{.*}}(%rip), %rax # CHECK-NEXT: movq {{.*}}(%rip), %rax ## literal pool symbol address: _foo_tlv # CHECK-NEXT: movq {{.*}}(%rip), %rax ## literal pool symbol address: _bar_tlv # CHECK-NEXT: callq {{.*}} ## symbol stub for: _foo_fn @@ -21,8 +24,9 @@ # CHECK-NEXT: address index name # CHECK-NEXT: _bar_fn # CHECK-NEXT: _foo_fn -# CHECK-NEXT: Indirect symbols for (__DATA_CONST,__got) 3 entries +# CHECK-NEXT: Indirect symbols for (__DATA_CONST,__got) 4 entries # CHECK-NEXT: address index name +# CHECK-NEXT: LOCAL # CHECK-NEXT: _bar # CHECK-NEXT: _foo # CHECK-NEXT: _stub_binder @@ -35,7 +39,7 @@ # CHECK-NEXT: _bar_tlv # CHECK-NEXT: _foo_tlv -# DYSYMTAB: nindirectsyms 9 +# DYSYMTAB: nindirectsyms 10 #--- libfoo.s @@ -56,8 +60,19 @@ _main: movq _foo@GOTPCREL(%rip), %rax movq _bar@GOTPCREL(%rip), %rax + movq _baz@GOTPCREL(%rip), %rax + addq _quux@GOTPCREL(%rip), %rax mov _foo_tlv@TLVP(%rip), %rax mov _bar_tlv@TLVP(%rip), %rax callq _foo_fn callq _bar_fn ret + +#--- bar.s +.data +.globl _baz,_quux +.private_extern _baz,_quux +_baz: +.asciz "baz" +_quux: +.asciz "quux"