From 6e92f468c82bac06051675fa94f72ca2789d2bc0 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 9 Mar 2021 10:02:24 -0500 Subject: [PATCH] [lld/mac] warn on -install_name without -dylib The flag doesn't (and shouldn't) have an effect in that case. ld64 doesn't warn on this, but it seems like a good thing to do. If it causes problems in practice for some reason, we can revert it. Also add a dedicated test for install_name. Differential Revision: https://reviews.llvm.org/D98259 --- lld/MachO/Driver.cpp | 11 +++++++++-- lld/test/MachO/install-name.s | 29 +++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 lld/test/MachO/install-name.s diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp index b53ac2e..ccef589 100644 --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -827,8 +827,6 @@ bool macho::link(ArrayRef argsArr, bool canExitEarly, symtab->addDynamicLookup(arg->getValue()); config->outputFile = args.getLastArgValue(OPT_o, "a.out"); - config->installName = - args.getLastArgValue(OPT_install_name, config->outputFile); config->headerPad = args::getHex(args, OPT_headerpad, /*Default=*/32); config->headerPadMaxInstallNames = args.hasArg(OPT_headerpad_max_install_names); @@ -850,6 +848,15 @@ bool macho::link(ArrayRef argsArr, bool canExitEarly, config->demangle = args.hasArg(OPT_demangle); config->implicitDylibs = !args.hasArg(OPT_no_implicit_dylibs); + if (const Arg *arg = args.getLastArg(OPT_install_name)) { + if (config->outputType != MH_DYLIB) + warn(arg->getAsString(args) + ": ignored, only has effect with -dylib"); + else + config->installName = arg->getValue(); + } else if (config->outputType == MH_DYLIB) { + config->installName = config->outputFile; + } + if (args.hasArg(OPT_mark_dead_strippable_dylib)) { if (config->outputType != MH_DYLIB) warn("-mark_dead_strippable_dylib: ignored, only has effect with -dylib"); diff --git a/lld/test/MachO/install-name.s b/lld/test/MachO/install-name.s new file mode 100644 index 0000000..6456792 --- /dev/null +++ b/lld/test/MachO/install-name.s @@ -0,0 +1,29 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos -o %t.o %s + +# RUN: %no_fatal_warnings_lld -o %t.exec %t.o -install_name foo 2>&1 \ +# RUN: | FileCheck --check-prefix=WARN %s +# RUN: llvm-objdump --macho --all-headers %t.exec \ +# RUN: | FileCheck --check-prefix=NO-ID %s + +# RUN: %no_fatal_warnings_lld -bundle -o %t.bundle %t.o -install_name foo 2>&1 \ +# RUN: | FileCheck --check-prefix=WARN %s +# RUN: llvm-objdump --macho --all-headers %t.bundle \ +# RUN: | FileCheck --check-prefix=NO-ID %s + +# RUN: %lld -dylib -o %t.dylib %t.o -install_name foo 2>&1 +# RUN: llvm-objdump --macho --all-headers %t.dylib \ +# RUN: | FileCheck --check-prefix=ID %s + +# WARN: warning: -install_name foo: ignored, only has effect with -dylib + +# NO-ID-NOT: LC_ID_DYLIB + +# ID: cmd LC_ID_DYLIB +# ID-NEXT: cmdsize +# LID-NEXT: name foo + +.globl _main +_main: + ret -- 2.7.4