[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