[lld] r178838 - This fixes a SIGSEGV failure in ReaderArchive while trying to trace what

Shankar Easwaran shankare at codeaurora.org
Thu Apr 4 20:50:15 PDT 2013


Author: shankare
Date: Thu Apr  4 22:50:15 2013
New Revision: 178838

URL: http://llvm.org/viewvc/llvm-project?rev=178838&view=rev
Log:
This fixes a SIGSEGV failure in ReaderArchive while trying to trace what
InputFile is being pulled from the Archive library to resolve a symbol. 

The buffer which was being used was already being handed over to the
MemoryBuffer object and was being accessed after the hand over. 

Moving it before the buffer is handed over.

Modified:
    lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
    lld/trunk/lib/ReaderWriter/ReaderArchive.cpp

Modified: lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp?rev=178838&r1=178837&r2=178838&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp Thu Apr  4 22:50:15 2013
@@ -67,7 +67,7 @@ bool ELFTargetInfo::validate(raw_ostream
       _entrySymbolName = "_start";
     }
   }
-  
+
   if (_inputFiles.empty()) {
     diagnostics << "No input files\n";
     return true;
@@ -144,14 +144,31 @@ std::unique_ptr<ELFTargetInfo> ELFTarget
 }
 
 bool ELFTargetInfo::appendLibrary(StringRef libName) {
-  SmallString<128> fullPath;
+  bool foundFile = false;
+  StringRef pathref;
   for (StringRef dir : _inputSearchPaths) {
-    // FIXME: need to handle other extensions, like .so
-    fullPath.assign(dir);
-    llvm::sys::path::append(fullPath, Twine("lib") + libName + ".a");
-    StringRef pathref = fullPath.str();
-    unsigned pathlen = pathref.size();
-    if (llvm::sys::fs::exists(pathref)) {
+    // Search for dynamic library
+    if (!_isStaticExecutable) {
+      SmallString<128> dynlibPath;
+      dynlibPath.assign(dir);
+      llvm::sys::path::append(dynlibPath, Twine("lib") + libName + ".so");
+      pathref = dynlibPath.str();
+      if (llvm::sys::fs::exists(pathref)) {
+        foundFile = true;
+      }
+    }
+    // Search for static libraries too
+    if (!foundFile) {
+      SmallString<128> archivefullPath;
+      archivefullPath.assign(dir);
+      llvm::sys::path::append(archivefullPath, Twine("lib") + libName + ".a");
+      pathref = archivefullPath.str();
+      if (llvm::sys::fs::exists(pathref)) {
+        foundFile = true;
+      }
+    }
+    if (foundFile) {
+      unsigned pathlen = pathref.size();
       char *x = _extraStrings.Allocate<char>(pathlen);
       memcpy(x, pathref.data(), pathlen);
       appendInputFile(StringRef(x,pathlen));

Modified: lld/trunk/lib/ReaderWriter/ReaderArchive.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ReaderArchive.cpp?rev=178838&r1=178837&r2=178838&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ReaderArchive.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ReaderArchive.cpp Thu Apr  4 22:50:15 2013
@@ -45,9 +45,9 @@ public:
     OwningPtr<MemoryBuffer> buff;
     if (ci->getMemoryBuffer(buff, true))
       return nullptr;
-    std::unique_ptr<MemoryBuffer> mb(buff.take());
     if (_targetInfo.logInputFiles())
       llvm::outs() << buff->getBufferIdentifier() << "\n";
+    std::unique_ptr<MemoryBuffer> mb(buff.take());
     if (_targetInfo.parseFile(mb, result))
       return nullptr;
 
@@ -153,7 +153,7 @@ public:
     }
   }
 
-  std::unordered_map<StringRef, 
+  std::unordered_map<StringRef,
                      llvm::object::Archive::child_iterator> _symbolMemberMap;
 }; // class FileArchive
 





More information about the llvm-commits mailing list