summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Driver.cpp8
-rw-r--r--lld/ELF/Driver.h1
-rw-r--r--lld/test/ELF/archive.s4
-rw-r--r--lld/test/ELF/whole-archive.s6
4 files changed, 18 insertions, 1 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 95d099fb40c..320f9cbef0f 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -71,7 +71,8 @@ static std::pair<ELFKind, uint16_t> parseEmulation(StringRef S) {
// Returns slices of MB by parsing MB as an archive file.
// Each slice consists of a member file in the archive.
-static std::vector<MemoryBufferRef> getArchiveMembers(MemoryBufferRef MB) {
+std::vector<MemoryBufferRef>
+LinkerDriver::getArchiveMembers(MemoryBufferRef MB) {
std::unique_ptr<Archive> File =
check(Archive::create(MB), "failed to parse archive");
@@ -85,6 +86,11 @@ static std::vector<MemoryBufferRef> getArchiveMembers(MemoryBufferRef MB) {
File->getFileName());
V.push_back(Mb);
}
+
+ // Take ownership of memory buffers created for members of thin archives.
+ for (std::unique_ptr<MemoryBuffer> &MB : File->takeThinBuffers())
+ OwningMBs.push_back(std::move(MB));
+
return V;
}
diff --git a/lld/ELF/Driver.h b/lld/ELF/Driver.h
index 0437ebf8338..0e9aaa9d6f4 100644
--- a/lld/ELF/Driver.h
+++ b/lld/ELF/Driver.h
@@ -28,6 +28,7 @@ public:
void addLibrary(StringRef Name);
private:
+ std::vector<MemoryBufferRef> getArchiveMembers(MemoryBufferRef MB);
void readConfigs(llvm::opt::InputArgList &Args);
void createFiles(llvm::opt::InputArgList &Args);
template <class ELFT> void link(llvm::opt::InputArgList &Args);
diff --git a/lld/test/ELF/archive.s b/lld/test/ELF/archive.s
index 41d74451cdd..59c96a5fba9 100644
--- a/lld/test/ELF/archive.s
+++ b/lld/test/ELF/archive.s
@@ -6,6 +6,10 @@
# RUN: llvm-ar rcs %tar %t2 %t3 %t4
# RUN: ld.lld %t %tar %t5 -o %tout
# RUN: llvm-nm %tout | FileCheck %s
+# RUN: rm -f %tarthin
+# RUN: llvm-ar --format=gnu rcsT %tarthin %t2 %t3 %t4
+# RUN: ld.lld %t %tarthin %t5 -o %tout
+# RUN: llvm-nm %tout | FileCheck %s
# REQUIRES: x86
# Nothing here. Just needed for the linker to create a undefined _start symbol.
diff --git a/lld/test/ELF/whole-archive.s b/lld/test/ELF/whole-archive.s
index 0a6b30fd171..a0ef6b983a6 100644
--- a/lld/test/ELF/whole-archive.s
+++ b/lld/test/ELF/whole-archive.s
@@ -30,5 +30,11 @@
// RUN: ld.lld -o %t3 %t.o --whole-archive %t.a --no-whole-archive
// RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=ADDED %s
+// --whole-archive should also work with thin archives
+// RUN: rm -f %tthin.a
+// RUN: llvm-ar --format=gnu rcsT %tthin.a %ta.o
+// RUN: ld.lld -o %t3 %t.o --whole-archive %tthin.a
+// RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=ADDED %s
+
.globl _start;
_start:
OpenPOWER on IntegriCloud