From 1715ce00e424afcc03eea25edec441ae14392304 Mon Sep 17 00:00:00 2001 From: John Criswell Date: Tue, 23 Dec 2003 17:37:06 +0000 Subject: [PATCH] Modified the linker so that it always links in an object from an archive that defines the symbol "main." This is a hack that ensures that programs that place their main function in a library and then link it in (i.e. Apache 2.x) get their main function linked in. There is probably a more correct way to do this, but this works for now. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10594 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Linker/LinkArchives.cpp | 32 +++++++++++++++++++++----------- tools/gccld/Linker.cpp | 32 +++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/lib/Linker/LinkArchives.cpp b/lib/Linker/LinkArchives.cpp index c230206d7e0..ec9f89c5e06 100644 --- a/lib/Linker/LinkArchives.cpp +++ b/lib/Linker/LinkArchives.cpp @@ -200,17 +200,27 @@ static bool LinkInArchive(Module *M, const std::set &DefSymbols = DefinedSymbols[i]; bool ObjectRequired = false; - for (std::set::iterator I = UndefinedSymbols.begin(), - E = UndefinedSymbols.end(); I != E; ++I) - if (DefSymbols.count(*I)) { - if (Verbose) - std::cerr << " Found object '" - << Objects[i]->getModuleIdentifier () - << "' providing symbol '" << *I << "'...\n"; - ObjectRequired = true; - break; - } - + + // + // If the object defines main(), then it is automatically required. + // Otherwise, look to see if it defines a symbol that is currently + // undefined. + // + if ((DefSymbols.find ("main")) == DefSymbols.end()) { + for (std::set::iterator I = UndefinedSymbols.begin(), + E = UndefinedSymbols.end(); I != E; ++I) + if (DefSymbols.count(*I)) { + if (Verbose) + std::cerr << " Found object '" + << Objects[i]->getModuleIdentifier () + << "' providing symbol '" << *I << "'...\n"; + ObjectRequired = true; + break; + } + } else { + ObjectRequired = true; + } + // We DO need to link this object into the program... if (ObjectRequired) { if (LinkModules(M, Objects[i], &ErrorMessage)) diff --git a/tools/gccld/Linker.cpp b/tools/gccld/Linker.cpp index c230206d7e0..ec9f89c5e06 100644 --- a/tools/gccld/Linker.cpp +++ b/tools/gccld/Linker.cpp @@ -200,17 +200,27 @@ static bool LinkInArchive(Module *M, const std::set &DefSymbols = DefinedSymbols[i]; bool ObjectRequired = false; - for (std::set::iterator I = UndefinedSymbols.begin(), - E = UndefinedSymbols.end(); I != E; ++I) - if (DefSymbols.count(*I)) { - if (Verbose) - std::cerr << " Found object '" - << Objects[i]->getModuleIdentifier () - << "' providing symbol '" << *I << "'...\n"; - ObjectRequired = true; - break; - } - + + // + // If the object defines main(), then it is automatically required. + // Otherwise, look to see if it defines a symbol that is currently + // undefined. + // + if ((DefSymbols.find ("main")) == DefSymbols.end()) { + for (std::set::iterator I = UndefinedSymbols.begin(), + E = UndefinedSymbols.end(); I != E; ++I) + if (DefSymbols.count(*I)) { + if (Verbose) + std::cerr << " Found object '" + << Objects[i]->getModuleIdentifier () + << "' providing symbol '" << *I << "'...\n"; + ObjectRequired = true; + break; + } + } else { + ObjectRequired = true; + } + // We DO need to link this object into the program... if (ObjectRequired) { if (LinkModules(M, Objects[i], &ErrorMessage)) -- 2.34.1