From 206252cc9f5509b27aa0761c677fdee8daff001c Mon Sep 17 00:00:00 2001 From: Shankar Easwaran Date: Tue, 13 Nov 2012 18:38:42 +0000 Subject: [PATCH] Adding changes to support GNU style archive library reading git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167853 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/Archive.h | 14 ++ lib/Object/Archive.cpp | 144 +++++++++++++--- test/Object/Inputs/coff_archive.lib | Bin 0 -> 41196 bytes test/Object/Inputs/liblong_filenames.a | Bin 0 -> 10920 bytes test/Object/Inputs/libsimple_archive.a | Bin 0 -> 1596 bytes test/Object/archive-long-index.test | 40 +++++ test/Object/coff-archive.test | 225 +++++++++++++++++++++++++ test/Object/simple-archive.test | 12 ++ tools/llvm-nm/llvm-nm.cpp | 22 +++ 9 files changed, 431 insertions(+), 26 deletions(-) create mode 100755 test/Object/Inputs/coff_archive.lib create mode 100644 test/Object/Inputs/liblong_filenames.a create mode 100644 test/Object/Inputs/libsimple_archive.a create mode 100644 test/Object/archive-long-index.test create mode 100644 test/Object/coff-archive.test create mode 100644 test/Object/simple-archive.test diff --git a/include/llvm/Object/Archive.h b/include/llvm/Object/Archive.h index f3d824960c2..9cd587195a4 100644 --- a/include/llvm/Object/Archive.h +++ b/include/llvm/Object/Archive.h @@ -122,6 +122,16 @@ public: Archive(MemoryBuffer *source, error_code &ec); + enum Kind { + K_GNU, + K_BSD, + K_COFF + }; + + Kind kind() const { + return Format; + } + child_iterator begin_children(bool skip_internal = true) const; child_iterator end_children() const; @@ -133,9 +143,13 @@ public: return v->isArchive(); } + // check if a symbol is in the archive + child_iterator findSym(StringRef name) const; + private: child_iterator SymbolTable; child_iterator StringTable; + Kind Format; }; } diff --git a/lib/Object/Archive.cpp b/lib/Object/Archive.cpp index 2a5951ada50..b55dab8f85d 100644 --- a/lib/Object/Archive.cpp +++ b/lib/Object/Archive.cpp @@ -122,7 +122,14 @@ error_code Archive::Child::getName(StringRef &Result) const { + sizeof(ArchiveMemberHeader) + Parent->StringTable->getSize())) return object_error::parse_failed; - Result = addr; + + // GNU long file names end with a /. + if (Parent->kind() == K_GNU) { + StringRef::size_type End = StringRef(addr).find('/'); + Result = StringRef(addr, End); + } else { + Result = addr; + } return object_error::success; } else if (name.startswith("#1/")) { APInt name_size; @@ -187,15 +194,52 @@ Archive::Archive(MemoryBuffer *source, error_code &ec) child_iterator i = begin_children(false); child_iterator e = end_children(); - if (i != e) ++i; // Nobody cares about the first member. - if (i != e) { - SymbolTable = i; - ++i; - } - if (i != e) { - StringTable = i; - } + StringRef name; + if ((ec = i->getName(name))) + return; + // Below is the pattern that is used to figure out the archive format + // GNU archive format + // First member : / (points to the symbol table ) + // Second member : // (may exist, if it exists, points to the string table) + // Note : The string table is used if the filename exceeds 15 characters + // BSD archive format + // First member : __.SYMDEF (points to the symbol table) + // There is no string table, if the filename exceeds 15 characters or has a + // embedded space, the filename has #1/, The size represents the size + // of the filename that needs to be read after the archive header + // COFF archive format + // First member : / + // Second member : / (provides a directory of symbols) + // Third member : // contains the string table, this is present even if the + // string table is empty + if (name == "/") { + SymbolTable = i; + StringTable = e; + if (i != e) ++i; + if ((ec = i->getName(name))) + return; + if (name[0] != '/') { + Format = K_GNU; + } else if ((name.size() > 1) && (name == "//")) { + Format = K_GNU; + StringTable = i; + ++i; + } else { + Format = K_COFF; + if (i != e) { + SymbolTable = i; + ++i; + } + if (i != e) { + StringTable = i; + } + } + } else if (name == "__.SYMDEF") { + Format = K_BSD; + SymbolTable = i; + StringTable = e; + } ec = object_error::success; } @@ -222,17 +266,28 @@ error_code Archive::Symbol::getName(StringRef &Result) const { error_code Archive::Symbol::getMember(child_iterator &Result) const { const char *buf = Parent->SymbolTable->getBuffer()->getBufferStart(); - uint32_t member_count = *reinterpret_cast(buf); const char *offsets = buf + 4; - buf += 4 + (member_count * 4); // Skip offsets. - const char *indicies = buf + 4; - - uint16_t offsetindex = - *(reinterpret_cast(indicies) - + SymbolIndex); - - uint32_t offset = *(reinterpret_cast(offsets) - + (offsetindex - 1)); + uint32_t offset = 0; + if (Parent->kind() == K_GNU) { + offset = *(reinterpret_cast(offsets) + + SymbolIndex); + } else if (Parent->kind() == K_BSD) { + assert("BSD format is not supported"); + } else { + uint32_t member_count = 0; + member_count = *reinterpret_cast(buf); + buf += 4 + (member_count * 4); // Skip offsets. + const char *indicies = buf + 4; + uint16_t offsetindex = + *(reinterpret_cast(indicies) + + SymbolIndex); + uint32_t *offsetaddr = + (uint32_t *)(reinterpret_cast(offsets) + + (offsetindex - 1)); + assert((const char *)offsetaddr < + Parent->SymbolTable->getBuffer()->getBufferEnd()); + offset = *(offsetaddr); + } const char *Loc = Parent->getData().begin() + offset; size_t Size = sizeof(ArchiveMemberHeader) + @@ -253,10 +308,20 @@ Archive::Symbol Archive::Symbol::getNext() const { Archive::symbol_iterator Archive::begin_symbols() const { const char *buf = SymbolTable->getBuffer()->getBufferStart(); - uint32_t member_count = *reinterpret_cast(buf); - buf += 4 + (member_count * 4); // Skip offsets. - uint32_t symbol_count = *reinterpret_cast(buf); - buf += 4 + (symbol_count * 2); // Skip indices. + if (kind() == K_GNU) { + uint32_t symbol_count = 0; + symbol_count = *reinterpret_cast(buf); + buf += sizeof(uint32_t) + (symbol_count * (sizeof(uint32_t))); + } else if (kind() == K_BSD) { + assert("BSD archive format is not supported"); + } else { + uint32_t member_count = 0; + uint32_t symbol_count = 0; + member_count = *reinterpret_cast(buf); + buf += 4 + (member_count * 4); // Skip offsets. + symbol_count = *reinterpret_cast(buf); + buf += 4 + (symbol_count * 2); // Skip indices. + } uint32_t string_start_offset = buf - SymbolTable->getBuffer()->getBufferStart(); return symbol_iterator(Symbol(this, 0, string_start_offset)); @@ -264,9 +329,36 @@ Archive::symbol_iterator Archive::begin_symbols() const { Archive::symbol_iterator Archive::end_symbols() const { const char *buf = SymbolTable->getBuffer()->getBufferStart(); - uint32_t member_count = *reinterpret_cast(buf); - buf += 4 + (member_count * 4); // Skip offsets. - uint32_t symbol_count = *reinterpret_cast(buf); + uint32_t symbol_count = 0; + if (kind() == K_GNU) { + symbol_count = *reinterpret_cast(buf); + buf += sizeof(uint32_t) + (symbol_count * (sizeof(uint32_t))); + } else if (kind() == K_BSD) { + assert("BSD archive format is not supported"); + } else { + uint32_t member_count = 0; + member_count = *reinterpret_cast(buf); + buf += 4 + (member_count * 4); // Skip offsets. + symbol_count = *reinterpret_cast(buf); + } return symbol_iterator( Symbol(this, symbol_count, 0)); } + +Archive::child_iterator Archive::findSym(StringRef name) const { + Archive::symbol_iterator bs = begin_symbols(); + Archive::symbol_iterator es = end_symbols(); + Archive::child_iterator result; + + StringRef symname; + for (; bs != es; ++bs) { + if (bs->getName(symname)) + return end_children(); + if (symname == name) { + if (bs->getMember(result)) + return end_children(); + return result; + } + } + return end_children(); +} diff --git a/test/Object/Inputs/coff_archive.lib b/test/Object/Inputs/coff_archive.lib new file mode 100755 index 0000000000000000000000000000000000000000..e079991bfbacb145f6f7b535355d1ab6e917a936 GIT binary patch literal 41196 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 literal 0 HcmV?d00001 diff --git a/test/Object/Inputs/libsimple_archive.a b/test/Object/Inputs/libsimple_archive.a new file mode 100644 index 0000000000000000000000000000000000000000..6e232e3e3cf838041c046efe4203ecb2b573930a GIT binary patch literal 1596 zcmb_cOK;Oa5FRI`k5EvGdZ<(m%LNrgT)*;Yg{q(kil737hy({j9mgSQW2e{-q&)y9 zByRj1?)(-cuH2EzjO{Jc#Rm?Iv^(E?J3BKw>-DwUZsZMjDx2cGn0DQ47%kg&gfP-2 zJ_}K|r2l>e07^J!G~Axo_Xn?sql3e75KfNXL~$~G`)+o8Vp_ISZ!}vFxT6qEeR3|P z%x5))unfoA+OiDFXc|Vt!5U1*Y-AbtD{Ls0I& zsqo}WBK0=I=|Voe=LW-apQIimAdVgrmyfy8;v{0(KS@78pq`1=jtcs}fV|uR{U(1VH%r{&_j&iH{myj#UFY@~7ez>Ul`5MRMHwQmYIVW-X z?Diy+>2hHuR9{htiC15Zj6 WithoutAliases("without-aliases", cl::Hidden, cl::desc("Exclude aliases from output")); + cl::opt ArchiveMap("print-armap", + cl::desc("Print the archive map")); + cl::alias ArchiveMaps("s", cl::desc("Alias for --print-armap"), + cl::aliasopt(ArchiveMap)); bool PrintAddress = true; bool MultipleFiles = false; @@ -346,6 +350,24 @@ static void DumpSymbolNamesFromFile(std::string &Filename) { return; if (object::Archive *a = dyn_cast(arch.get())) { + if (ArchiveMap) { + outs() << "Archive map" << "\n"; + for (object::Archive::symbol_iterator i = a->begin_symbols(), + e = a->end_symbols(); i != e; ++i) { + object::Archive::child_iterator c; + StringRef symname; + StringRef filename; + if (error(i->getMember(c))) + return; + if (error(i->getName(symname))) + return; + if (error(c->getName(filename))) + return; + outs() << symname << " in " << filename << "\n"; + } + outs() << "\n"; + } + for (object::Archive::child_iterator i = a->begin_children(), e = a->end_children(); i != e; ++i) { OwningPtr child; -- 2.34.1