diff options
-rw-r--r-- | lld/ELF/Driver.cpp | 3 | ||||
-rw-r--r-- | lld/test/ELF/reproduce-thin-archive.s | 6 |
2 files changed, 9 insertions, 0 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index ca3b8fae1b9..309f96d54da 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -128,6 +128,7 @@ std::vector<std::pair<MemoryBufferRef, uint64_t>> static getArchiveMembers( std::vector<std::pair<MemoryBufferRef, uint64_t>> V; Error Err = Error::success(); + bool AddToTar = File->isThin() && Tar; for (const ErrorOr<Archive::Child> &COrErr : File->children(Err)) { Archive::Child C = check(COrErr, MB.getBufferIdentifier() + @@ -136,6 +137,8 @@ std::vector<std::pair<MemoryBufferRef, uint64_t>> static getArchiveMembers( check(C.getMemoryBufferRef(), MB.getBufferIdentifier() + ": could not get the buffer for a child of the archive"); + if (AddToTar) + Tar->append(relativeToRoot(check(C.getFullName())), MBRef.getBuffer()); V.push_back(std::make_pair(MBRef, C.getChildOffset())); } if (Err) diff --git a/lld/test/ELF/reproduce-thin-archive.s b/lld/test/ELF/reproduce-thin-archive.s index 2de88d77f51..c3e6e88757e 100644 --- a/lld/test/ELF/reproduce-thin-archive.s +++ b/lld/test/ELF/reproduce-thin-archive.s @@ -5,11 +5,17 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.dir/foo.o # RUN: cd %t.dir # RUN: llvm-ar --format=gnu rcT foo.a foo.o + # RUN: ld.lld -m elf_x86_64 foo.a -o bar --reproduce repro.tar # RUN: tar xf repro.tar # RUN: diff foo.a repro/%:t.dir/foo.a # RUN: diff foo.o repro/%:t.dir/foo.o +# RUN: ld.lld -m elf_x86_64 --whole-archive foo.a -o bar --reproduce repro2.tar +# RUN: tar xf repro2.tar +# RUN: diff foo.a repro2/%:t.dir/foo.a +# RUN: diff foo.o repro2/%:t.dir/foo.o + .globl _start _start: nop |