Index: ELF/Driver.cpp =================================================================== --- ELF/Driver.cpp +++ ELF/Driver.cpp @@ -338,6 +338,8 @@ for (std::unique_ptr &F : Files) Symtab.addFile(std::move(F)); + if (HasError) + return; // There were duplicate symbols or incompatible files for (StringRef S : Config->Undefined) Symtab.addUndefinedOpt(S); Index: ELF/SymbolTable.cpp =================================================================== --- ELF/SymbolTable.cpp +++ ELF/SymbolTable.cpp @@ -30,25 +30,26 @@ // All input object files must be for the same architecture // (e.g. it does not make sense to link x86 object files with // MIPS object files.) This function checks for that fatal. -template -static void checkCompatibility(InputFile *FileP) { +template static bool isCompatible(InputFile *FileP) { auto *F = dyn_cast>(FileP); if (!F) - return; + return true; if (F->getELFKind() == Config->EKind && F->getEMachine() == Config->EMachine) - return; + return true; StringRef A = F->getName(); StringRef B = Config->Emulation; if (B.empty()) B = Config->FirstElf->getName(); - fatal(A + " is incompatible with " + B); + error(A + " is incompatible with " + B); + return false; } // Add symbols in File to the symbol table. template void SymbolTable::addFile(std::unique_ptr File) { + if (!isCompatible(File.get())) + return; InputFile *FileP = File.get(); - checkCompatibility(FileP); // .a file if (auto *F = dyn_cast(FileP)) { @@ -181,17 +182,20 @@ return; } - if (New->isTls() != Existing->isTls()) - fatal("TLS attribute mismatch for symbol: " + conflictMsg(Existing, New)); + if (New->isTls() != Existing->isTls()) { + error("TLS attribute mismatch for symbol: " + conflictMsg(Existing, New)); + return; + } // compare() returns -1, 0, or 1 if the lhs symbol is less preferable, // equivalent (conflicting), or more preferable, respectively. int Comp = Existing->compare(New); if (Comp == 0) { std::string S = "duplicate symbol: " + conflictMsg(Existing, New); - if (!Config->AllowMultipleDefinition) - fatal(S); - warning(S); + if (Config->AllowMultipleDefinition) + warning(S); + else + error(S); return; } if (Comp < 0) Index: test/ELF/conflict.s =================================================================== --- test/ELF/conflict.s +++ test/ELF/conflict.s @@ -7,10 +7,14 @@ # RUN: FileCheck -check-prefix=NO_DEMANGLE %s # DEMANGLE: duplicate symbol: {{mul\(double, double\)|_Z3muldd}} in +# DEMANGLE: duplicate symbol: foo in + # NO_DEMANGLE: duplicate symbol: _Z3muldd in +# NO_DEMANGLE: duplicate symbol: foo in -.globl _Z3muldd +.globl _Z3muldd, foo _Z3muldd: +foo: mov $60, %rax mov $42, %rdi syscall