From 0dc92f6a740adc8f7c61b4884614534cd6351b89 Mon Sep 17 00:00:00 2001 From: Paul Semel Date: Thu, 5 Jul 2018 14:43:29 +0000 Subject: [PATCH] [llvm-objdump] Add --archive-headers (-a) option llvm-svn: 336357 --- .../tools/llvm-objdump/Inputs/liblong_filenames.a | Bin 0 -> 10920 bytes .../tools/llvm-objdump/archive-headers-disas.test | 29 +++++++ llvm/test/tools/llvm-objdump/archive-headers.test | 21 +++++ llvm/tools/llvm-objdump/MachODump.cpp | 5 -- llvm/tools/llvm-objdump/llvm-objdump.cpp | 88 +++++++++++++++++++-- 5 files changed, 133 insertions(+), 10 deletions(-) create mode 100644 llvm/test/tools/llvm-objdump/Inputs/liblong_filenames.a create mode 100644 llvm/test/tools/llvm-objdump/archive-headers-disas.test create mode 100644 llvm/test/tools/llvm-objdump/archive-headers.test diff --git a/llvm/test/tools/llvm-objdump/Inputs/liblong_filenames.a b/llvm/test/tools/llvm-objdump/Inputs/liblong_filenames.a new file mode 100644 index 0000000000000000000000000000000000000000..368d665c94ee5fea976adaea1c944c1e1ef31f0c GIT binary patch literal 10920 zcmeHN&2Jk;6dxz0Y26kj2vDIQ)(1+di0xf}B~?|qirONG3aW?{4i#BD4oMR`!FEd8 z1N4N%jWZ|ygdBTB>V-dnBNrr&fiqHgzukGx%k!>3qC!&SC+)sBZ|2RseKYf$@r+Z~ z{bqIbMl$0ZCO21bi>~XrvyPJuvgF%wT(4*imXgMp^Ts6Zh0nz6lzcOMrXCve+LkeI zEF1IoqA{tJ@VWe>U#TwFR=!+ad$7JyZ)|RT)oiu5AAY^_=&|eN@`Yk)#?<|_hFNL2 z^yC8GTJ;<2e$)7-5v^2N=&Hk3=rZ*R@t9!n%Bpdls94RerUtuYscvK*+()CFhF!iV4g z{uJpy@VfsDU1RRd&0TY@EL64|?d{C`TElN{I{9=d?M>%4wySH)-uq#aioS~SM2W}u zOk!s;aq0ZTnIEXFw@8NvG>O;EmnXj)o4auOV=91jy7j2u_AA8O&5*CM)U0jz>2__W zZPLqr+c)V-t7X#F&3e7oAYEg#T}$7&yD;5q`_*-m4vN=SzgTJd^%|;v9^_CZ2-#^> zS=pw8ZxVT@gbeW#Jz59-;!Ai_e}v2+-e@O?iO^rR`f=itKD7y5w@!aRcVIVDUkvv=yQ&P1;XG#0 zei<)%pQDk}!SMUfo;!A9e0H$=c7NSY%+5B#vW!~5KuFE&$!^$W2gBSV3EoZD@bsSdi*+B6cFf3Lw#&I0DJuz(p71DC4K zwn6RVu#N4Hifs>K{KvOSira^=J+MoXwnsV=TdeYDYYa@pFG9vfxj)pghsmy0zL?me zM~Ml3^-h_;_Bn^S$rD!a(PgqQ^vrihGati6P+7=Q>_pruQ^YZP_2?_xe9g4|Xy*UB zGaqOnNh6QUlQPO3->yQBk{&a^fYU0IERN>9?7p7zXtfV9O9zQpYpvIF=A^Io|NA*# zq&Z(P$xL`%$_L1OZvkgZqaA+d*OeXQWj)w!S|f0Z^q2>ub^dU`7&DH0hmZb|q%lk8 zNg3r%(mMYR`4hRr?{Om)?f^15-o=N2(EmQEH1t{O=srn~oo>0`&VtWo*m6*m;rkr6 zW3KJveoYK&A9s$x_E))K%XyYDKdJXge8wox3y$MH>8NL})9){XeSF4l4ex+=jTr mG&Z3RF%CyNs7{CiVYGufh{y1E)q0c}6Ne!^{?ij;Me-jX$lree literal 0 HcmV?d00001 diff --git a/llvm/test/tools/llvm-objdump/archive-headers-disas.test b/llvm/test/tools/llvm-objdump/archive-headers-disas.test new file mode 100644 index 0000000..3b2a5cb --- /dev/null +++ b/llvm/test/tools/llvm-objdump/archive-headers-disas.test @@ -0,0 +1,29 @@ +# RUN: llvm-objdump -a -d %p/Inputs/liblong_filenames.a | FileCheck %s + +# CHECK: {{.*}}liblong_filenames.a(1.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 1416 Tue Oct 30 15:33:29 2012 1.o +# CHECK: Disassembly of section .text: + +# CHECK: {{.*}}liblong_filenames.a(2.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 1224 Tue Oct 30 15:33:29 2012 2.o +# CHECK: Disassembly of section .text: + +# CHECK: {{.*}}liblong_filenames.a(3.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 1312 Tue Oct 30 15:33:29 2012 3.o +# CHECK: Disassembly of section .text: + +# CHECK: {{.*}}liblong_filenames.a(4.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 957 Tue Oct 30 15:33:29 2012 4.o +# CHECK: {{.*}}liblong_filenames.a(5.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 951 Tue Oct 30 15:33:29 2012 5.o +# CHECK: {{.*}}liblong_filenames.a(6.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 951 Tue Oct 30 15:33:29 2012 6.o +# CHECK: {{.*}}liblong_filenames.a(abcdefghijklmnopqrstuvwxyz1.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 977 Tue Oct 30 15:33:29 2012 abcdefghijklmnopqrstuvwxyz1.o + +# CHECK: {{.*}}liblong_filenames.a(abcdefghijklmnopqrstuvwxyz2.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 1272 Tue Oct 30 15:33:29 2012 abcdefghijklmnopqrstuvwxyz2.o +# CHECK: Disassembly of section .text: + +# CHECK: {{.*}}liblong_filenames.a(abcdefghijklmnopq.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 977 Tue Oct 30 15:29:33 2012 abcdefghijklmnopq.o diff --git a/llvm/test/tools/llvm-objdump/archive-headers.test b/llvm/test/tools/llvm-objdump/archive-headers.test new file mode 100644 index 0000000..9724f46 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/archive-headers.test @@ -0,0 +1,21 @@ +# RUN: llvm-objdump -a %p/Inputs/liblong_filenames.a | FileCheck %s +# RUN: llvm-objdump -archive-headers %p/Inputs/liblong_filenames.a | FileCheck %s + +# CHECK: {{.*}}liblong_filenames.a(1.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 1416 Tue Oct 30 15:33:29 2012 1.o +# CHECK: {{.*}}liblong_filenames.a(2.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 1224 Tue Oct 30 15:33:29 2012 2.o +# CHECK: {{.*}}liblong_filenames.a(3.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 1312 Tue Oct 30 15:33:29 2012 3.o +# CHECK: {{.*}}liblong_filenames.a(4.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 957 Tue Oct 30 15:33:29 2012 4.o +# CHECK: {{.*}}liblong_filenames.a(5.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 951 Tue Oct 30 15:33:29 2012 5.o +# CHECK: {{.*}}liblong_filenames.a(6.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 951 Tue Oct 30 15:33:29 2012 6.o +# CHECK: {{.*}}liblong_filenames.a(abcdefghijklmnopqrstuvwxyz1.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 977 Tue Oct 30 15:33:29 2012 abcdefghijklmnopqrstuvwxyz1.o +# CHECK: {{.*}}liblong_filenames.a(abcdefghijklmnopqrstuvwxyz2.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 1272 Tue Oct 30 15:33:29 2012 abcdefghijklmnopqrstuvwxyz2.o +# CHECK: {{.*}}liblong_filenames.a(abcdefghijklmnopq.o): file format ELF64-x86-64 +# CHECK: rw-r--r-- 204299/200 977 Tue Oct 30 15:29:33 2012 abcdefghijklmnopq.o diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index 7e4f996..e7a1f47 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -76,11 +76,6 @@ cl::opt llvm::UniversalHeaders("universal-headers", "(requires -macho)")); cl::opt - llvm::ArchiveHeaders("archive-headers", - cl::desc("Print archive headers for Mach-O archives " - "(requires -macho)")); - -cl::opt ArchiveMemberOffsets("archive-member-offsets", cl::desc("Print the offset to each archive member for " "Mach-O archives (requires -macho and " diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index e639fd9..d1a765b 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -208,6 +208,14 @@ static cl::alias FileHeadersShort("f", cl::desc("Alias for --file-headers"), cl::aliasopt(FileHeaders)); cl::opt + llvm::ArchiveHeaders("archive-headers", + cl::desc("Display archive header information")); + +cl::alias +ArchiveHeadersShort("a", cl::desc("Alias for --archive-headers"), + cl::aliasopt(ArchiveHeaders)); + +cl::opt llvm::PrintImmHex("print-imm-hex", cl::desc("Use hex format for immediate values")); @@ -2144,7 +2152,72 @@ static void printFileHeaders(const ObjectFile *o) { << "\n"; } -static void DumpObject(ObjectFile *o, const Archive *a = nullptr) { +static void printArchiveChild(StringRef Filename, const Archive::Child &C) { + Expected ModeOrErr = C.getAccessMode(); + if (!ModeOrErr) { + errs() << "ill-formed archive entry.\n"; + consumeError(ModeOrErr.takeError()); + return; + } + sys::fs::perms Mode = ModeOrErr.get(); + outs() << ((Mode & sys::fs::owner_read) ? "r" : "-"); + outs() << ((Mode & sys::fs::owner_write) ? "w" : "-"); + outs() << ((Mode & sys::fs::owner_exe) ? "x" : "-"); + outs() << ((Mode & sys::fs::group_read) ? "r" : "-"); + outs() << ((Mode & sys::fs::group_write) ? "w" : "-"); + outs() << ((Mode & sys::fs::group_exe) ? "x" : "-"); + outs() << ((Mode & sys::fs::others_read) ? "r" : "-"); + outs() << ((Mode & sys::fs::others_write) ? "w" : "-"); + outs() << ((Mode & sys::fs::others_exe) ? "x" : "-"); + + outs() << " "; + + Expected UIDOrErr = C.getUID(); + if (!UIDOrErr) + report_error(Filename, UIDOrErr.takeError()); + unsigned UID = UIDOrErr.get(); + outs() << format("%d/", UID); + + Expected GIDOrErr = C.getGID(); + if (!GIDOrErr) + report_error(Filename, GIDOrErr.takeError()); + unsigned GID = GIDOrErr.get(); + outs() << format("%-d ", GID); + + Expected Size = C.getRawSize(); + if (!Size) + report_error(Filename, Size.takeError()); + outs() << format("%6" PRId64, Size.get()) << " "; + + StringRef RawLastModified = C.getRawLastModified(); + unsigned Seconds; + if (RawLastModified.getAsInteger(10, Seconds)) + outs() << "(date: \"" << RawLastModified + << "\" contains non-decimal chars) "; + else { + // Since ctime(3) returns a 26 character string of the form: + // "Sun Sep 16 01:03:52 1973\n\0" + // just print 24 characters. + time_t t = Seconds; + outs() << format("%.24s ", ctime(&t)); + } + + StringRef Name = ""; + Expected NameOrErr = C.getName(); + if (!NameOrErr) { + consumeError(NameOrErr.takeError()); + Expected RawNameOrErr = C.getRawName(); + if (!RawNameOrErr) + report_error(Filename, NameOrErr.takeError()); + Name = RawNameOrErr.get(); + } else { + Name = NameOrErr.get(); + } + outs() << Name << "\n"; +} + +static void DumpObject(ObjectFile *o, const Archive *a = nullptr, + const Archive::Child *c = nullptr) { StringRef ArchiveName = a != nullptr ? a->getFileName() : ""; // Avoid other output when using a raw option. if (!RawClangAST) { @@ -2156,6 +2229,8 @@ static void DumpObject(ObjectFile *o, const Archive *a = nullptr) { outs() << ":\tfile format " << o->getFileFormatName() << "\n\n"; } + if (ArchiveHeaders && !MachOOpt) + printArchiveChild(a->getFileName(), *c); if (Disassemble) DisassembleObject(o, Relocations); if (Relocations && !Disassemble) @@ -2197,7 +2272,8 @@ static void DumpObject(ObjectFile *o, const Archive *a = nullptr) { } } -static void DumpObject(const COFFImportFile *I, const Archive *A) { +static void DumpObject(const COFFImportFile *I, const Archive *A, + const Archive::Child *C = nullptr) { StringRef ArchiveName = A ? A->getFileName() : ""; // Avoid other output when using a raw option. @@ -2207,6 +2283,8 @@ static void DumpObject(const COFFImportFile *I, const Archive *A) { << ":\tfile format COFF-import-file" << "\n\n"; + if (ArchiveHeaders && !MachOOpt) + printArchiveChild(A->getFileName(), *C); if (SymbolTable) printCOFFSymbolTable(I); } @@ -2222,9 +2300,9 @@ static void DumpArchive(const Archive *a) { continue; } if (ObjectFile *o = dyn_cast(&*ChildOrErr.get())) - DumpObject(o, a); + DumpObject(o, a, &C); else if (COFFImportFile *I = dyn_cast(&*ChildOrErr.get())) - DumpObject(I, a); + DumpObject(I, a, &C); else report_error(a->getFileName(), object_error::invalid_file_type); } @@ -2299,7 +2377,7 @@ int main(int argc, char **argv) { && !WeakBind && !RawClangAST && !(UniversalHeaders && MachOOpt) - && !(ArchiveHeaders && MachOOpt) + && !ArchiveHeaders && !(IndirectSymbols && MachOOpt) && !(DataInCode && MachOOpt) && !(LinkOptHints && MachOOpt) -- 2.7.4