From be9ab2682e3bd88424016121e72c4485964ca90a Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 22 Jul 2015 19:34:26 +0000 Subject: Fix fetching the symbol table of a thin archive. We were trying to read it as an external file. llvm-svn: 242926 --- llvm/lib/Object/Archive.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'llvm/lib/Object/Archive.cpp') diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp index a1e5eb27689..941f72bb6a6 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()) -- cgit v1.2.3