From be9ab2682e3bd88424016121e72c4485964ca90a Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 22 Jul 2015 19:34:26 +0000 Subject: [PATCH] Fix fetching the symbol table of a thin archive. We were trying to read it as an external file. llvm-svn: 242926 --- llvm/include/llvm/Object/Archive.h | 2 ++ llvm/lib/Object/Archive.cpp | 17 +++++++++++------ llvm/test/Object/archive-symtab.test | 11 +++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/llvm/include/llvm/Object/Archive.h b/llvm/include/llvm/Object/Archive.h index e5d59d8..d7f4655 100644 --- a/llvm/include/llvm/Object/Archive.h +++ b/llvm/include/llvm/Object/Archive.h @@ -62,6 +62,8 @@ public: return reinterpret_cast(Data.data()); } + bool isThinMember() const; + public: Child(const Archive *Parent, const char *Start); diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp index a1e5eb2..941f72b 100644 --- a/llvm/lib/Object/Archive.cpp +++ b/llvm/lib/Object/Archive.cpp @@ -87,17 +87,17 @@ Archive::Child::Child(const Archive *Parent, const char *Start) if (!Start) return; - const ArchiveMemberHeader *Header = - reinterpret_cast(Start); uint64_t Size = sizeof(ArchiveMemberHeader); - if (!Parent->IsThin || Header->getName() == "/" || Header->getName() == "//") - Size += Header->getSize(); Data = StringRef(Start, Size); + if (!isThinMember()) { + Size += getRawSize(); + Data = StringRef(Start, Size); + } // Setup StartOfFile and PaddingBytes. StartOfFile = sizeof(ArchiveMemberHeader); // Don't include attached name. - StringRef Name = Header->getName(); + StringRef Name = getRawName(); if (Name.startswith("#1/")) { uint64_t NameSize; if (Name.substr(3).rtrim(" ").getAsInteger(10, NameSize)) @@ -116,8 +116,13 @@ uint64_t Archive::Child::getRawSize() const { return getHeader()->getSize(); } +bool Archive::Child::isThinMember() const { + StringRef Name = getHeader()->getName(); + return Parent->IsThin && Name != "/" && Name != "//"; +} + ErrorOr Archive::Child::getBuffer() const { - if (!Parent->IsThin) + if (!isThinMember()) return StringRef(Data.data() + StartOfFile, getSize()); ErrorOr Name = getName(); if (std::error_code EC = Name.getError()) diff --git a/llvm/test/Object/archive-symtab.test b/llvm/test/Object/archive-symtab.test index 6e4c76f..8ba4ba0 100644 --- a/llvm/test/Object/archive-symtab.test +++ b/llvm/test/Object/archive-symtab.test @@ -8,6 +8,17 @@ CHECK-NEXT: foo in trivial-object-test2.elf-x86-64 CHECK-NEXT: main in trivial-object-test2.elf-x86-64 CHECK-NOT: bar + +RUN: rm -f %t.a +RUN: llvm-ar rcT %t.a %p/Inputs/trivial-object-test.elf-x86-64 %p/Inputs/trivial-object-test2.elf-x86-64 +RUN: llvm-nm -M %t.a | FileCheck --check-prefix=THIN %s + +THIN: Archive map +THIN-NEXT: main in {{.*}}/Inputs/trivial-object-test.elf-x86-64 +THIN-NEXT: foo in {{.*}}/Inputs/trivial-object-test2.elf-x86-64 +THIN-NEXT: main in {{.*}}/Inputs/trivial-object-test2.elf-x86-64 + + CHECK: trivial-object-test.elf-x86-64: CHECK-NEXT: U SomeOtherFunction CHECK-NEXT: 0000000000000000 T main -- 2.7.4