summaryrefslogtreecommitdiff
path: root/lib/Linker/LinkArchives.cpp
diff options
context:
space:
mode:
authorJohn Criswell <criswell@uiuc.edu>2003-12-23 17:37:06 +0000
committerJohn Criswell <criswell@uiuc.edu>2003-12-23 17:37:06 +0000
commit1715ce00e424afcc03eea25edec441ae14392304 (patch)
tree129a77f00d7b533fd724c14e44a6b798fc4e3df1 /lib/Linker/LinkArchives.cpp
parentac1ccae982d9e718ef1234baa4f0255d5d3a64f3 (diff)
downloadllvm-1715ce00e424afcc03eea25edec441ae14392304.tar.gz
llvm-1715ce00e424afcc03eea25edec441ae14392304.tar.bz2
llvm-1715ce00e424afcc03eea25edec441ae14392304.tar.xz
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
Diffstat (limited to 'lib/Linker/LinkArchives.cpp')
-rw-r--r--lib/Linker/LinkArchives.cpp32
1 files changed, 21 insertions, 11 deletions
diff --git a/lib/Linker/LinkArchives.cpp b/lib/Linker/LinkArchives.cpp
index c230206d7e..ec9f89c5e0 100644
--- a/lib/Linker/LinkArchives.cpp
+++ b/lib/Linker/LinkArchives.cpp
@@ -200,17 +200,27 @@ static bool LinkInArchive(Module *M,
const std::set<std::string> &DefSymbols = DefinedSymbols[i];
bool ObjectRequired = false;
- for (std::set<std::string>::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<std::string>::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))