diff options
Diffstat (limited to 'ELF/Driver.cpp')
| -rw-r--r-- | ELF/Driver.cpp | 34 | 
1 files changed, 31 insertions, 3 deletions
| diff --git a/ELF/Driver.cpp b/ELF/Driver.cpp index 1fc552f011b64..693dba64ab5ac 100644 --- a/ELF/Driver.cpp +++ b/ELF/Driver.cpp @@ -302,6 +302,14 @@ static void checkOptions(opt::InputArgList &Args) {      if (Config->Pie)        error("-r and -pie may not be used together");    } + +  if (Config->ExecuteOnly) { +    if (Config->EMachine != EM_AARCH64) +      error("-execute-only is only supported on AArch64 targets"); + +    if (Config->SingleRoRx && !Script->HasSectionsCommand) +      error("-execute-only and -no-rosegment cannot be used together"); +  }  }  static const char *getReproduceOption(opt::InputArgList &Args) { @@ -493,6 +501,8 @@ static bool isOutputFormatBinary(opt::InputArgList &Args) {      StringRef S = Arg->getValue();      if (S == "binary")        return true; +    if (S.startswith("elf")) +      return false;      error("unknown --oformat value: " + S);    }    return false; @@ -747,6 +757,8 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {    Config->EnableNewDtags =        Args.hasFlag(OPT_enable_new_dtags, OPT_disable_new_dtags, true);    Config->Entry = Args.getLastArgValue(OPT_entry); +  Config->ExecuteOnly = +      Args.hasFlag(OPT_execute_only, OPT_no_execute_only, false);    Config->ExportDynamic =        Args.hasFlag(OPT_export_dynamic, OPT_no_export_dynamic, false);    Config->FilterList = args::getStrings(Args, OPT_filter); @@ -1303,6 +1315,12 @@ static void findKeepUniqueSections(opt::InputArgList &Args) {    }  } +static const char *LibcallRoutineNames[] = { +#define HANDLE_LIBCALL(code, name) name, +#include "llvm/IR/RuntimeLibcalls.def" +#undef HANDLE_LIBCALL +}; +  // Do actual linking. Note that when this function is called,  // all linker scripts have already been parsed.  template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) { @@ -1369,11 +1387,21 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {    for (StringRef S : Config->Undefined)      handleUndefined<ELFT>(S); -  // If an entry symbol is in a static archive, pull out that file now -  // to complete the symbol table. After this, no new names except a -  // few linker-synthesized ones will be added to the symbol table. +  // If an entry symbol is in a static archive, pull out that file now.    handleUndefined<ELFT>(Config->Entry); +  // If any of our inputs are bitcode files, the LTO code generator may create +  // references to certain library functions that might not be explicit in the +  // bitcode file's symbol table. If any of those library functions are defined +  // in a bitcode file in an archive member, we need to arrange to use LTO to +  // compile those archive members by adding them to the link beforehand. +  // +  // With this the symbol table should be complete. After this, no new names +  // except a few linker-synthesized ones will be added to the symbol table. +  if (!BitcodeFiles.empty()) +    for (const char *S : LibcallRoutineNames) +      handleUndefined<ELFT>(S); +    // Return if there were name resolution errors.    if (errorCount())      return; | 
