diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -1241,7 +1241,8 @@ for (const auto &pair : config->aliasedSymbols) { if (const auto &sym = symtab->find(pair.first)) { if (const auto &defined = dyn_cast(sym)) { - symtab->aliasDefined(defined, pair.second, defined->getFile()); + symtab->aliasDefined(defined, pair.second, defined->getFile()) + ->noDeadStrip = true; } else { error("TODO: support aliasing to symbols of kind " + Twine(sym->kind())); diff --git a/lld/MachO/MarkLive.cpp b/lld/MachO/MarkLive.cpp --- a/lld/MachO/MarkLive.cpp +++ b/lld/MachO/MarkLive.cpp @@ -229,7 +229,7 @@ // FIXME: When we implement these flags, make symbols from them GC // roots: // * -reexported_symbol(s_list) - // * -alias(-list) + // * -alias_list // * -init // In dylibs and bundles and in executables with -export_dynamic, diff --git a/lld/test/MachO/alias-option.s b/lld/test/MachO/alias-option.s --- a/lld/test/MachO/alias-option.s +++ b/lld/test/MachO/alias-option.s @@ -21,7 +21,9 @@ # MAIN: [[#%x,FOO_ADDR:]] T _foo # MAIN: [[#FOO_ADDR]] T _main -# RUN: %lld -alias _foo _bar -alias _main _fake_main %t/main.o %t/foo.o -o %t/multiple.o +## Verify dead stripping doesn't remove the aliased symbol. This behavior differs +## from ld64 where it actually does dead strip only the alias, not the original symbol. +# RUN: %lld -dead_strip -alias _foo _bar -alias _main _fake_main %t/main.o %t/foo.o -o %t/multiple.o # RUN: llvm-nm %t/multiple.o | FileCheck %s --check-prefix=MULTIPLE # MULTIPLE: [[#%x,FOO_ADDR:]] T _bar @@ -30,11 +32,13 @@ # MULTIPLE: [[#MAIN_ADDR]] T _main #--- foo.s +.subsections_via_symbols .globl _foo _foo: ret #--- main.s +.subsections_via_symbols .globl _main _main: ret