diff --git a/llvm/tools/llvm-ld/llvm-ld.cpp b/llvm/tools/llvm-ld/llvm-ld.cpp
index db5c417..41d9510 100644
--- a/llvm/tools/llvm-ld/llvm-ld.cpp
+++ b/llvm/tools/llvm-ld/llvm-ld.cpp
@@ -90,7 +90,7 @@
 
 /// This is just for convenience so it doesn't have to be passed around
 /// everywhere.
-static const char* progname = 0;
+static std::string progname;
 
 /// PrintAndReturn - Prints a message to standard error and returns true.
 ///
@@ -368,14 +368,50 @@
   // on the command line, so that we don't have to do this manually!
   for (std::vector<std::string>::iterator i = Libraries.begin(), 
          e = Libraries.end(); i != e; ++i) {
-    std::string FullLibraryPath = FindLib(*i, LibPaths, true);
-    if (!FullLibraryPath.empty() && IsSharedObject(FullLibraryPath))
-      Out2 << "    -load=" << FullLibraryPath << " \\\n";
+    sys::Path FullLibraryPath = sys::Path::FindLibrary(*i);
+    if (!FullLibraryPath.isEmpty() && FullLibraryPath.isDynamicLibrary())
+      Out2 << "    -load=" << FullLibraryPath.toString() << " \\\n";
   }
   Out2 << "    $0.bc ${1+\"$@\"}\n";
   Out2.close();
 }
 
+// BuildLinkItems -- This function generates a LinkItemList for the LinkItems
+// linker function by combining the Files and Libraries in the order they were
+// declared on the command line.
+static void BuildLinkItems(
+  Linker::ItemList& Items,
+  const cl::list<std::string>& Files,
+  const cl::list<std::string>& Libraries) {
+
+  // Build the list of linkage items for LinkItems. 
+
+  cl::list<std::string>::const_iterator fileIt = Files.begin();
+  cl::list<std::string>::const_iterator libIt  = Libraries.begin();
+
+  int libPos = -1, filePos = -1;
+  while ( 1 ) {
+    if (libIt != Libraries.end())
+      libPos = Libraries.getPosition(libIt - Libraries.begin());
+    else
+      libPos = -1;
+    if (fileIt != Files.end())
+      filePos = Files.getPosition(fileIt - Files.begin());
+    else
+      filePos = -1;
+
+    if (filePos != -1 && (libPos == -1 || filePos < libPos)) {
+      // Add a source file
+      Items.push_back(std::make_pair(*fileIt++, false));
+    } else if (libPos != -1 && (filePos == -1 || libPos < filePos)) {
+      // Add a library
+      Items.push_back(std::make_pair(*libIt++, true));
+    } else {
+        break; // we're done with the list
+    }
+  }
+}
+
 // Rightly this should go in a header file but it just seems such a waste.
 namespace llvm {
 extern void Optimize(Module*);
@@ -383,44 +419,46 @@
 
 int main(int argc, char **argv, char **envp) {
   // Initial global variable above for convenience printing of program name.
-  progname = argv[0];
+  progname = sys::Path(argv[0]).getBasename();
+  Linker TheLinker(progname, Verbose);
+  
+  // Set up the library paths for the Linker
+  TheLinker.addPaths(LibPaths);
+  TheLinker.addSystemPaths();
 
   // Parse the command line options
-  cl::ParseCommandLineOptions(argc, argv, " llvm linker for GCC\n");
+  cl::ParseCommandLineOptions(argc, argv, " llvm linker\n");
   sys::PrintStackTraceOnErrorSignal();
 
   // Remove any consecutive duplicates of the same library...
   Libraries.erase(std::unique(Libraries.begin(), Libraries.end()),
                   Libraries.end());
 
-  // Set up the Composite module.
-  std::auto_ptr<Module> Composite(0);
-
   if (LinkAsLibrary) {
-    // Link in only the files.
-    Composite.reset( new Module(argv[0]) );
-    if (LinkFiles(argv[0], Composite.get(), InputFilenames, Verbose))
+    std::vector<sys::Path> Files;
+    for (unsigned i = 0; i < InputFilenames.size(); ++i )
+      Files.push_back(sys::Path(InputFilenames[i]));
+    if (TheLinker.LinkInFiles(Files))
       return 1; // Error already printed
 
     // The libraries aren't linked in but are noted as "dependent" in the
     // module.
     for (cl::list<std::string>::const_iterator I = Libraries.begin(), 
          E = Libraries.end(); I != E ; ++I) {
-      Composite.get()->addLibrary(*I);
+      TheLinker.getModule()->addLibrary(*I);
     }
   } else {
     // Build a list of the items from our command line
-    LinkItemList Items;
+    Linker::ItemList Items;
     BuildLinkItems(Items, InputFilenames, Libraries);
 
     // Link all the items together
-    Composite.reset( LinkItems(argv[0], Items, LibPaths, Verbose, Native) );
-
-    // Check for an error during linker
-    if (!Composite.get())
-      return 1; // Error already printed
+    if (TheLinker.LinkInItems(Items) )
+      return 1;
   }
 
+  std::auto_ptr<Module> Composite(TheLinker.releaseModule());
+
   // Optimize the module
   Optimize(Composite.get());
 
