1a9232f7f5d00d900eb10a39e0b7786954d6eac69Benjamin Kramer//===- llvm-readobj.cpp - Dump contents of an Object File -----------------===// 25c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer// 35c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer// The LLVM Compiler Infrastructure 45c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer// 55c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer// This file is distributed under the University of Illinois Open Source 65c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer// License. See LICENSE.TXT for details. 75c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer// 85c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer//===----------------------------------------------------------------------===// 95c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer// 10dd3aa9eab2b40ea1573a5482472bbb89e6f1038dMichael J. Spencer// This is a tool similar to readelf, except it works on multiple object file 11dd3aa9eab2b40ea1573a5482472bbb89e6f1038dMichael J. Spencer// formats. The main purpose of this tool is to provide detailed output suitable 12dd3aa9eab2b40ea1573a5482472bbb89e6f1038dMichael J. Spencer// for FileCheck. 13ee37b6e4cd53b8e2412c522eeab4e39b434f00c6David Meyer// 14dd3aa9eab2b40ea1573a5482472bbb89e6f1038dMichael J. Spencer// Flags should be similar to readelf where supported, but the output format 15dd3aa9eab2b40ea1573a5482472bbb89e6f1038dMichael J. Spencer// does not need to be identical. The point is to not make users learn yet 16dd3aa9eab2b40ea1573a5482472bbb89e6f1038dMichael J. Spencer// another set of flags. 17ee37b6e4cd53b8e2412c522eeab4e39b434f00c6David Meyer// 18dd3aa9eab2b40ea1573a5482472bbb89e6f1038dMichael J. Spencer// Output should be specialized for each format where appropriate. 19ee37b6e4cd53b8e2412c522eeab4e39b434f00c6David Meyer// 20ee37b6e4cd53b8e2412c522eeab4e39b434f00c6David Meyer//===----------------------------------------------------------------------===// 215c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 22d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer#include "llvm-readobj.h" 2376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "Error.h" 2476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "ObjDumper.h" 25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/MemoryTypeTableBuilder.h" 2676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Object/Archive.h" 27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Object/COFFImportFile.h" 2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Object/ELFObjectFile.h" 294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Object/MachOUniversal.h" 30f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Object/ObjectFile.h" 3176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/Casting.h" 325c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer#include "llvm/Support/CommandLine.h" 3376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/DataTypes.h" 345c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer#include "llvm/Support/Debug.h" 3576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/FileSystem.h" 3676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/ManagedStatic.h" 37f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Support/PrettyStackTrace.h" 38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/ScopedPrinter.h" 39f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Support/Signals.h" 4076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/TargetRegistry.h" 4176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/TargetSelect.h" 4276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include <string> 43c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include <system_error> 4476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 455c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerusing namespace llvm; 465c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyerusing namespace llvm::object; 475c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 4876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophernamespace opts { 4976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::list<std::string> InputFilenames(cl::Positional, 5076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("<input object files>"), 5176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::ZeroOrMore); 5276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 5376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // -file-headers, -h 5476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::opt<bool> FileHeaders("file-headers", 5576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Display file headers ")); 5676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::alias FileHeadersShort("h", 5776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Alias for --file-headers"), 5876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::aliasopt(FileHeaders)); 5976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 6076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // -sections, -s 6176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::opt<bool> Sections("sections", 6276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Display all sections.")); 6376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::alias SectionsShort("s", 6476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Alias for --sections"), 6576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::aliasopt(Sections)); 6676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 6776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // -section-relocations, -sr 6876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::opt<bool> SectionRelocations("section-relocations", 6976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Display relocations for each section shown.")); 7076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::alias SectionRelocationsShort("sr", 7176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Alias for --section-relocations"), 7276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::aliasopt(SectionRelocations)); 7376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 7476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // -section-symbols, -st 7576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::opt<bool> SectionSymbols("section-symbols", 7676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Display symbols for each section shown.")); 7776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::alias SectionSymbolsShort("st", 7876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Alias for --section-symbols"), 7976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::aliasopt(SectionSymbols)); 8076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 8176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // -section-data, -sd 8276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::opt<bool> SectionData("section-data", 8376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Display section data for each section shown.")); 8476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::alias SectionDataShort("sd", 8576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Alias for --section-data"), 8676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::aliasopt(SectionData)); 8776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 8876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // -relocations, -r 8976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::opt<bool> Relocations("relocations", 9076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Display the relocation entries in the file")); 9176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::alias RelocationsShort("r", 9276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Alias for --relocations"), 9376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::aliasopt(Relocations)); 9476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 95f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // -dyn-relocations 96f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::opt<bool> DynRelocs("dyn-relocations", 97f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::desc("Display the dynamic relocation entries in the file")); 98f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 9976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // -symbols, -t 10076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::opt<bool> Symbols("symbols", 10176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Display the symbol table")); 10276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::alias SymbolsShort("t", 10376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Alias for --symbols"), 10476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::aliasopt(Symbols)); 10576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 10676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // -dyn-symbols, -dt 10776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::opt<bool> DynamicSymbols("dyn-symbols", 10876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Display the dynamic symbol table")); 10976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::alias DynamicSymbolsShort("dt", 11076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Alias for --dyn-symbols"), 11176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::aliasopt(DynamicSymbols)); 11276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 11376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // -unwind, -u 11476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::opt<bool> UnwindInfo("unwind", 11576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Display unwind information")); 11676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::alias UnwindInfoShort("u", 11776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Alias for --unwind"), 11876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::aliasopt(UnwindInfo)); 11976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 12076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // -dynamic-table 12176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::opt<bool> DynamicTable("dynamic-table", 12276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Display the ELF .dynamic section table")); 12376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 12476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // -needed-libs 12576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::opt<bool> NeededLibraries("needed-libs", 12676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::desc("Display the needed libraries")); 1271c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck 128cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck // -program-headers 129cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck cl::opt<bool> ProgramHeaders("program-headers", 130cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck cl::desc("Display ELF program headers")); 131cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck 132f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // -hash-table 133f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::opt<bool> HashTable("hash-table", 134f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::desc("Display ELF hash table")); 135f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 136f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // -gnu-hash-table 137f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::opt<bool> GnuHashTable("gnu-hash-table", 138f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::desc("Display ELF .gnu.hash section")); 139f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 1401c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck // -expand-relocs 1411c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck cl::opt<bool> ExpandRelocs("expand-relocs", 1421c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck cl::desc("Expand each shown relocation to multiple lines")); 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 144ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // -codeview 145ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines cl::opt<bool> CodeView("codeview", 146ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines cl::desc("Display CodeView debug information")); 147ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // -codeview-merged-types 149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::opt<bool> 150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CodeViewMergedTypes("codeview-merged-types", 151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::desc("Display the merged CodeView type stream")); 152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 153ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // -codeview-subsection-bytes 154ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines cl::opt<bool> CodeViewSubsectionBytes( 155ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines "codeview-subsection-bytes", 156ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines cl::desc("Dump raw contents of codeview debug sections and records")); 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // -arm-attributes, -a 15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cl::opt<bool> ARMAttributes("arm-attributes", 16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cl::desc("Display the ARM attributes section")); 16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cl::alias ARMAttributesShort("-a", cl::desc("Alias for --arm-attributes"), 16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cl::aliasopt(ARMAttributes)); 163c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 164c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines // -mips-plt-got 165c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines cl::opt<bool> 166c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines MipsPLTGOT("mips-plt-got", 167c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines cl::desc("Display the MIPS GOT and PLT GOT sections")); 16837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 1696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // -mips-abi-flags 1706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar cl::opt<bool> MipsABIFlags("mips-abi-flags", 1716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar cl::desc("Display the MIPS.abiflags section")); 1726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 173f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // -mips-reginfo 174f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::opt<bool> MipsReginfo("mips-reginfo", 175f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::desc("Display the MIPS .reginfo section")); 176f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // -mips-options 178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::opt<bool> MipsOptions("mips-options", 179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::desc("Display the MIPS .MIPS.options section")); 180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 18137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // -coff-imports 18237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines cl::opt<bool> 18337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines COFFImports("coff-imports", cl::desc("Display the PE/COFF import table")); 18437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 185ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // -coff-exports 186ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines cl::opt<bool> 187ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines COFFExports("coff-exports", cl::desc("Display the PE/COFF export table")); 188ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 18937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // -coff-directives 19037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines cl::opt<bool> 19137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines COFFDirectives("coff-directives", 19237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines cl::desc("Display the PE/COFF .drectve section")); 19337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 19437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // -coff-basereloc 19537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines cl::opt<bool> 19637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines COFFBaseRelocs("coff-basereloc", 19737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines cl::desc("Display the PE/COFF .reloc section")); 19876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // -coff-debug-directory 200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::opt<bool> 201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar COFFDebugDirectory("coff-debug-directory", 202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::desc("Display the PE/COFF debug directory")); 203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 204f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // -macho-data-in-code 205f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::opt<bool> 206f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MachODataInCode("macho-data-in-code", 207f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::desc("Display MachO Data in Code command")); 208f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 209f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // -macho-indirect-symbols 210f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::opt<bool> 211f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MachOIndirectSymbols("macho-indirect-symbols", 212f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::desc("Display MachO indirect symbols")); 213f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 214f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // -macho-linker-options 215f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::opt<bool> 216f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MachOLinkerOptions("macho-linker-options", 217f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::desc("Display MachO linker options")); 218f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 219f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // -macho-segment 220f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::opt<bool> 221f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MachOSegment("macho-segment", 222f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::desc("Display MachO Segment command")); 223f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 224f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // -macho-version-min 225f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::opt<bool> 226f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MachOVersionMin("macho-version-min", 227f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::desc("Display MachO version min command")); 228f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 229f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // -macho-dysymtab 230f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::opt<bool> 231f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MachODysymtab("macho-dysymtab", 232f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::desc("Display MachO Dysymtab command")); 233f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 234f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // -stackmap 235f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::opt<bool> 236f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar PrintStackMap("stackmap", 237f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::desc("Display contents of stackmap section")); 238f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 239f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // -version-info 240f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::opt<bool> 241f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar VersionInfo("version-info", 242f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::desc("Display ELF version sections (if present)")); 243f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::alias VersionInfoShort("V", cl::desc("Alias for -version-info"), 244f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar cl::aliasopt(VersionInfo)); 245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::opt<bool> SectionGroups("elf-section-groups", 247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::desc("Display ELF section group contents")); 248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::alias SectionGroupsShort("g", cl::desc("Alias for -elf-sections-groups"), 249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::aliasopt(SectionGroups)); 250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::opt<bool> HashHistogram( 251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar "elf-hash-histogram", 252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::desc("Display bucket list histogram for hash sections")); 253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::alias HashHistogramShort("I", cl::desc("Alias for -elf-hash-histogram"), 254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::aliasopt(HashHistogram)); 255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::opt<OutputStyleTy> 257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Output("elf-output-style", cl::desc("Specify ELF dump style"), 258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::values(clEnumVal(LLVM, "LLVM default style"), 259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar clEnumVal(GNU, "GNU readelf style"), clEnumValEnd), 260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::init(LLVM)); 261f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} // namespace opts 262081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer 26376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophernamespace llvm { 26476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 265f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVM_ATTRIBUTE_NORETURN void reportError(Twine Msg) { 266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar errs() << "\nError reading file: " << Msg << ".\n"; 267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar errs().flush(); 268f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar exit(1); 269f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 270f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 271f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid error(std::error_code EC) { 27276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (!EC) 273f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return; 27476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 275f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar reportError(EC.message()); 276148ee4f224be6448834bf039807c70bb1a7c78f5Rafael Espindola} 277148ee4f224be6448834bf039807c70bb1a7c78f5Rafael Espindola 27876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherbool relocAddressLess(RelocationRef a, RelocationRef b) { 279f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return a.getOffset() < b.getOffset(); 280fc73847d8fa79d310b26b7a80275dc48755ec2e3Rafael Espindola} 281fc73847d8fa79d310b26b7a80275dc48755ec2e3Rafael Espindola 28276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} // namespace llvm 2835c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 284c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesstatic void reportError(StringRef Input, std::error_code EC) { 28576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (Input == "-") 28676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Input = "<stdin>"; 287fc73847d8fa79d310b26b7a80275dc48755ec2e3Rafael Espindola 288f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar reportError(Twine(Input) + ": " + EC.message()); 289fc73847d8fa79d310b26b7a80275dc48755ec2e3Rafael Espindola} 290fc73847d8fa79d310b26b7a80275dc48755ec2e3Rafael Espindola 29176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic void reportError(StringRef Input, StringRef Message) { 29276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (Input == "-") 29376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Input = "<stdin>"; 2945c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 295f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar reportError(Twine(Input) + ": " + Message); 2965c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer} 2975c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void reportError(StringRef Input, Error Err) { 299de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Input == "-") 300de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Input = "<stdin>"; 301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string ErrMsg; 302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar { 303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_string_ostream ErrStream(ErrMsg); 304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar logAllUnhandledErrors(std::move(Err), ErrStream, Input + ": "); 305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 306de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar reportError(ErrMsg); 307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 308de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 309c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesstatic bool isMipsArch(unsigned Arch) { 310c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines switch (Arch) { 311c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines case llvm::Triple::mips: 312c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines case llvm::Triple::mipsel: 313c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines case llvm::Triple::mips64: 314c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines case llvm::Triple::mips64el: 315c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return true; 316c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines default: 317c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return false; 318c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines } 319c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines} 320c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic llvm::codeview::MemoryTypeTableBuilder CVTypes; 322de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 32376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher/// @brief Creates an format-specific object file dumper. 324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic std::error_code createDumper(const ObjectFile *Obj, 325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ScopedPrinter &Writer, 326c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::unique_ptr<ObjDumper> &Result) { 32776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (!Obj) 32876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher return readobj_error::unsupported_file_format; 32976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 33076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (Obj->isCOFF()) 33176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher return createCOFFDumper(Obj, Writer, Result); 33276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (Obj->isELF()) 33376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher return createELFDumper(Obj, Writer, Result); 33476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (Obj->isMachO()) 33576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher return createMachODumper(Obj, Writer, Result); 33676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 33776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher return readobj_error::unsupported_obj_file_format; 3385c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer} 3395c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 34076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher/// @brief Dumps the specified object file. 34176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic void dumpObject(const ObjectFile *Obj) { 342de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ScopedPrinter Writer(outs()); 34336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<ObjDumper> Dumper; 344f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (std::error_code EC = createDumper(Obj, Writer, Dumper)) 34576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher reportError(Obj->getFileName(), EC); 346fc73847d8fa79d310b26b7a80275dc48755ec2e3Rafael Espindola 347de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (opts::Output == opts::LLVM) { 348de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar outs() << '\n'; 349de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar outs() << "File: " << Obj->getFileName() << "\n"; 350de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar outs() << "Format: " << Obj->getFileFormatName() << "\n"; 351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar outs() << "Arch: " << Triple::getArchTypeName( 352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar (llvm::Triple::ArchType)Obj->getArch()) << "\n"; 353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar outs() << "AddressSize: " << (8 * Obj->getBytesInAddress()) << "bit\n"; 354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Dumper->printLoadName(); 355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 35676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 35776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (opts::FileHeaders) 35876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Dumper->printFileHeaders(); 35976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (opts::Sections) 36076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Dumper->printSections(); 36176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (opts::Relocations) 36276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Dumper->printRelocations(); 363f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::DynRelocs) 364f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printDynamicRelocations(); 36576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (opts::Symbols) 36676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Dumper->printSymbols(); 36776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (opts::DynamicSymbols) 36876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Dumper->printDynamicSymbols(); 36976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (opts::UnwindInfo) 37076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Dumper->printUnwindInfo(); 37176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (opts::DynamicTable) 37276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Dumper->printDynamicTable(); 37376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (opts::NeededLibraries) 37476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Dumper->printNeededLibraries(); 375cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck if (opts::ProgramHeaders) 376cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck Dumper->printProgramHeaders(); 377f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::HashTable) 378f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printHashTable(); 379f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::GnuHashTable) 380f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printGnuHashTable(); 381f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::VersionInfo) 382f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printVersionInfo(); 383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Obj->isELF()) { 384de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Obj->getArch() == llvm::Triple::arm) 385de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (opts::ARMAttributes) 386de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Dumper->printAttributes(); 387de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (isMipsArch(Obj->getArch())) { 388de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (opts::MipsPLTGOT) 389de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Dumper->printMipsPLTGOT(); 390de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (opts::MipsABIFlags) 391de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Dumper->printMipsABIFlags(); 392de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (opts::MipsReginfo) 393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Dumper->printMipsReginfo(); 394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (opts::MipsOptions) 395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Dumper->printMipsOptions(); 396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (opts::SectionGroups) 398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Dumper->printGroupSections(); 399de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (opts::HashHistogram) 400de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Dumper->printHashHistogram(); 401f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 402f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (Obj->isCOFF()) { 403f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::COFFImports) 404f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printCOFFImports(); 405f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::COFFExports) 406f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printCOFFExports(); 407f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::COFFDirectives) 408f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printCOFFDirectives(); 409f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::COFFBaseRelocs) 410f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printCOFFBaseReloc(); 411de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (opts::COFFDebugDirectory) 412de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Dumper->printCOFFDebugDirectory(); 413f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::CodeView) 414f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printCodeViewDebugInfo(); 415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (opts::CodeViewMergedTypes) 416de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Dumper->mergeCodeViewTypes(CVTypes); 417f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 418f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (Obj->isMachO()) { 419f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::MachODataInCode) 420f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printMachODataInCode(); 421f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::MachOIndirectSymbols) 422f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printMachOIndirectSymbols(); 423f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::MachOLinkerOptions) 424f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printMachOLinkerOptions(); 425f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::MachOSegment) 426f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printMachOSegment(); 427f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::MachOVersionMin) 428f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printMachOVersionMin(); 429f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::MachODysymtab) 430f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printMachODysymtab(); 4316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 432f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (opts::PrintStackMap) 433f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Dumper->printStackMap(); 43497f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer} 43597f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer 43676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher/// @brief Dumps each object file in \a Arc; 43776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic void dumpArchive(const Archive *Arc) { 438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Error Err; 439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto &Child : Arc->children(Err)) { 440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Expected<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary(); 441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!ChildOrErr) { 442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError())) { 443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string Buf; 444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_string_ostream OS(Buf); 445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar logAllUnhandledErrors(ChildOrErr.takeError(), OS, ""); 446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS.flush(); 447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar reportError(Arc->getFileName(), Buf); 448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 44976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher continue; 45076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 451c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (ObjectFile *Obj = dyn_cast<ObjectFile>(&*ChildOrErr.get())) 45276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher dumpObject(Obj); 45376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher else 45476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher reportError(Arc->getFileName(), readobj_error::unrecognized_file_format); 4555c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer } 456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Err) 457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar reportError(Arc->getFileName(), std::move(Err)); 45876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 45976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 4604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar/// @brief Dumps each object file in \a MachO Universal Binary; 4614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic void dumpMachOUniversalBinary(const MachOUniversalBinary *UBinary) { 4624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar for (const MachOUniversalBinary::ObjectForArch &Obj : UBinary->objects()) { 463de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Expected<std::unique_ptr<MachOObjectFile>> ObjOrErr = Obj.getAsObjectFile(); 4640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar if (ObjOrErr) 4650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar dumpObject(&*ObjOrErr.get()); 466de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar else if (auto E = isNotObjectErrorInvalidFileType(ObjOrErr.takeError())) { 467de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string Buf; 468de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_string_ostream OS(Buf); 469de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar logAllUnhandledErrors(ObjOrErr.takeError(), OS, ""); 470de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS.flush(); 471de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar reportError(UBinary->getFileName(), Buf); 472de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 473de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar else if (Expected<std::unique_ptr<Archive>> AOrErr = Obj.getAsArchive()) 4740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar dumpArchive(&*AOrErr.get()); 4754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 4764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} 4775c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 47876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher/// @brief Opens \a File and dumps it. 47976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic void dumpInput(StringRef File) { 4805c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 48176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // Attempt to open the binary. 482de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Expected<OwningBinary<Binary>> BinaryOrErr = createBinary(File); 483de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!BinaryOrErr) 484de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar reportError(File, errorToErrorCode(BinaryOrErr.takeError())); 48537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Binary &Binary = *BinaryOrErr.get().getBinary(); 4865c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 48737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Archive *Arc = dyn_cast<Archive>(&Binary)) 48876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher dumpArchive(Arc); 4894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar else if (MachOUniversalBinary *UBinary = 4904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar dyn_cast<MachOUniversalBinary>(&Binary)) 4914c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar dumpMachOUniversalBinary(UBinary); 49237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines else if (ObjectFile *Obj = dyn_cast<ObjectFile>(&Binary)) 49376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher dumpObject(Obj); 494f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar else if (COFFImportFile *Import = dyn_cast<COFFImportFile>(&Binary)) 495f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar dumpCOFFImportFile(Import); 49676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher else 49776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher reportError(File, readobj_error::unrecognized_file_format); 49876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 49987b47ccc5afcdffb1fa7f04b27fca926ec7fb344Rafael Espindola 50076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherint main(int argc, const char *argv[]) { 501de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar sys::PrintStackTraceOnErrorSignal(argv[0]); 50276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher PrettyStackTraceProgram X(argc, argv); 50376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher llvm_shutdown_obj Y; 504fc73847d8fa79d310b26b7a80275dc48755ec2e3Rafael Espindola 50576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // Register the target printer for --version. 50676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion); 50776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 50876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher cl::ParseCommandLineOptions(argc, argv, "LLVM Object Reader\n"); 509d326d05fb9c794e93fc7fc0601028f196600f7e2Michael J. Spencer 51076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // Default to stdin if no filename is specified. 51176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (opts::InputFilenames.size() == 0) 51276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher opts::InputFilenames.push_back("-"); 51376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 51476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher std::for_each(opts::InputFilenames.begin(), opts::InputFilenames.end(), 51576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher dumpInput); 51687b47ccc5afcdffb1fa7f04b27fca926ec7fb344Rafael Espindola 517de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (opts::CodeViewMergedTypes) { 518de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ScopedPrinter W(outs()); 519de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar dumpCodeViewMergedTypes(W, CVTypes); 520de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 521de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 522f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return 0; 5235c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer} 524