diff --git a/lld/MachO/MarkLive.cpp b/lld/MachO/MarkLive.cpp index 4b6e2315b942..e4aba8fb90d4 100644 --- a/lld/MachO/MarkLive.cpp +++ b/lld/MachO/MarkLive.cpp @@ -96,8 +96,7 @@ void markLive() { } // -u symbols for (Symbol *sym : config->explicitUndefineds) - if (auto *defined = dyn_cast(sym)) - addSym(defined); + addSym(sym); // local symbols explicitly marked .no_dead_strip for (const InputFile *file : inputFiles) if (auto *objFile = dyn_cast(file)) diff --git a/lld/test/MachO/start-end.s b/lld/test/MachO/start-end.s index 86e1d900bf3d..3ca0048939b0 100644 --- a/lld/test/MachO/start-end.s +++ b/lld/test/MachO/start-end.s @@ -67,6 +67,13 @@ ## Test that the link succeeds with dead-stripping enabled too. # RUN: %lld -dead_strip -lSystem %t/main.o -o %t/stripped.out +# RUN: llvm-objdump --macho --syms --section-headers %t/stripped.out > %t-stripped-dump.txt +# RUN: llvm-objdump --macho -d --no-symbolic-operands --no-show-raw-insn %t/stripped.out >> %t-stripped-dump.txt +# RUN: FileCheck --check-prefix=STRIP %s < %t-stripped-dump.txt + +## -u 'section$start$*' does not cause an undefined symbol error. This matches ld64. +# RUN: %lld -dead_strip -lSystem %t/main.o -u 'section$start$__FOO$__notexist' -o %t/stripped1.out +# RUN: llvm-objdump --section-headers %t/stripped1.out | FileCheck --check-prefix=STRIP2 %s ## (Fun fact: `-e 'section$start$__TEXT$__text -dead_strip` strips ## everything in the text section because markLive runs well before @@ -76,6 +83,42 @@ ## and the output program crashes when running. This matches ld64's ## behavior.) +# STRIP-LABEL: Sections: +# STRIP-NEXT: Idx Name Size VMA Type +# STRIP-NEXT: 0 __text {{[0-9a-f]*}} [[#%x, TEXTSTART:]] TEXT +# STRIP-NEXT: 1 __cstring 00000000 [[#%x, CSTRINGSTART:]] DATA +# STRIP-NEXT: 2 __data 00000000 +# STRIP-NEXT: 3 __llvm_orderfile 00000000 +# STRIP-NEXT: 4 __mybss 00000000 +# STRIP-NEXT: 5 __bar 00000000 +# STRIP-NEXT: 6 __ever 00000000 +# STRIP-NEXT: 7 __lookup 00000000 +# STRIP-NEXT: 8 symbol 00000000 +# STRIP-NEXT: 9 __quux 00000000 + +# STRIP-LABEL: SYMBOL TABLE: +# STRIP-NOT: section$start$__FOO$__bar + +# STRIP-LABEL: _main: +# STRIP: [[#%x, PC1:]]: +# STRIP-SAME: leaq [[#%d, TEXTSTART - PC1 - 7]](%rip), %rax +# STRIP-NEXT: [[#%x, PC2:]]: +# STRIP-SAME: leaq [[#%d, CSTRINGSTART - PC2 - 7]](%rip), %rbx + +# STRIP2-LABEL: Sections: +# STRIP2-NEXT: Idx Name Size VMA Type +# STRIP2-NEXT: 0 __text {{[0-9a-f]*}} [[#%x, TEXTSTART:]] TEXT +# STRIP2-NEXT: 1 __cstring 00000000 [[#%x, CSTRINGSTART:]] DATA +# STRIP2-NEXT: 2 __data 00000000 +# STRIP2-NEXT: 3 __llvm_orderfile 00000000 +# STRIP2-NEXT: 4 __mybss 00000000 +# STRIP2-NEXT: 5 __bar 00000000 +# STRIP2-NEXT: 6 __notexist 00000000 +# STRIP2-NEXT: 7 __ever 00000000 +# STRIP2-NEXT: 8 __lookup 00000000 +# STRIP2-NEXT: 9 symbol 00000000 +# STRIP2-NEXT: 10 __quux 00000000 + # CHECK-LABEL: Sections: # CHECK-NEXT: Idx Name Size VMA Type # CHECK: 0 __text {{[0-9a-f]*}} [[#%x, TEXTSTART:]] TEXT