1*9880d681SAndroid Build Coastguard Worker //===-- MachODump.cpp - Object file dumping utility for llvm --------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file implements the MachO-specific dumper for llvm-readobj.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "Error.h"
15*9880d681SAndroid Build Coastguard Worker #include "ObjDumper.h"
16*9880d681SAndroid Build Coastguard Worker #include "StackMapPrinter.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm-readobj.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallString.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringExtras.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/MachO.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Casting.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ScopedPrinter.h"
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker using namespace llvm;
25*9880d681SAndroid Build Coastguard Worker using namespace object;
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker namespace {
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker class MachODumper : public ObjDumper {
30*9880d681SAndroid Build Coastguard Worker public:
MachODumper(const MachOObjectFile * Obj,ScopedPrinter & Writer)31*9880d681SAndroid Build Coastguard Worker MachODumper(const MachOObjectFile *Obj, ScopedPrinter &Writer)
32*9880d681SAndroid Build Coastguard Worker : ObjDumper(Writer), Obj(Obj) {}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker void printFileHeaders() override;
35*9880d681SAndroid Build Coastguard Worker void printSections() override;
36*9880d681SAndroid Build Coastguard Worker void printRelocations() override;
37*9880d681SAndroid Build Coastguard Worker void printSymbols() override;
38*9880d681SAndroid Build Coastguard Worker void printDynamicSymbols() override;
39*9880d681SAndroid Build Coastguard Worker void printUnwindInfo() override;
40*9880d681SAndroid Build Coastguard Worker void printStackMap() const override;
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker // MachO-specific.
43*9880d681SAndroid Build Coastguard Worker void printMachODataInCode() override;
44*9880d681SAndroid Build Coastguard Worker void printMachOVersionMin() override;
45*9880d681SAndroid Build Coastguard Worker void printMachODysymtab() override;
46*9880d681SAndroid Build Coastguard Worker void printMachOSegment() override;
47*9880d681SAndroid Build Coastguard Worker void printMachOIndirectSymbols() override;
48*9880d681SAndroid Build Coastguard Worker void printMachOLinkerOptions () override;
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker private:
51*9880d681SAndroid Build Coastguard Worker template<class MachHeader>
52*9880d681SAndroid Build Coastguard Worker void printFileHeaders(const MachHeader &Header);
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker void printSymbol(const SymbolRef &Symbol);
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker void printRelocation(const RelocationRef &Reloc);
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker void printRelocation(const MachOObjectFile *Obj, const RelocationRef &Reloc);
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker void printSections(const MachOObjectFile *Obj);
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker const MachOObjectFile *Obj;
63*9880d681SAndroid Build Coastguard Worker };
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker } // namespace
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker namespace llvm {
69*9880d681SAndroid Build Coastguard Worker
createMachODumper(const object::ObjectFile * Obj,ScopedPrinter & Writer,std::unique_ptr<ObjDumper> & Result)70*9880d681SAndroid Build Coastguard Worker std::error_code createMachODumper(const object::ObjectFile *Obj,
71*9880d681SAndroid Build Coastguard Worker ScopedPrinter &Writer,
72*9880d681SAndroid Build Coastguard Worker std::unique_ptr<ObjDumper> &Result) {
73*9880d681SAndroid Build Coastguard Worker const MachOObjectFile *MachOObj = dyn_cast<MachOObjectFile>(Obj);
74*9880d681SAndroid Build Coastguard Worker if (!MachOObj)
75*9880d681SAndroid Build Coastguard Worker return readobj_error::unsupported_obj_file_format;
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker Result.reset(new MachODumper(MachOObj, Writer));
78*9880d681SAndroid Build Coastguard Worker return readobj_error::success;
79*9880d681SAndroid Build Coastguard Worker }
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker } // namespace llvm
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker static const EnumEntry<uint32_t> MachOMagics[] = {
84*9880d681SAndroid Build Coastguard Worker { "Magic", MachO::MH_MAGIC },
85*9880d681SAndroid Build Coastguard Worker { "Cigam", MachO::MH_CIGAM },
86*9880d681SAndroid Build Coastguard Worker { "Magic64", MachO::MH_MAGIC_64 },
87*9880d681SAndroid Build Coastguard Worker { "Cigam64", MachO::MH_CIGAM_64 },
88*9880d681SAndroid Build Coastguard Worker { "FatMagic", MachO::FAT_MAGIC },
89*9880d681SAndroid Build Coastguard Worker { "FatCigam", MachO::FAT_CIGAM },
90*9880d681SAndroid Build Coastguard Worker };
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker static const EnumEntry<uint32_t> MachOHeaderFileTypes[] = {
93*9880d681SAndroid Build Coastguard Worker { "Relocatable", MachO::MH_OBJECT },
94*9880d681SAndroid Build Coastguard Worker { "Executable", MachO::MH_EXECUTE },
95*9880d681SAndroid Build Coastguard Worker { "FixedVMLibrary", MachO::MH_FVMLIB },
96*9880d681SAndroid Build Coastguard Worker { "Core", MachO::MH_CORE },
97*9880d681SAndroid Build Coastguard Worker { "PreloadedExecutable", MachO::MH_PRELOAD },
98*9880d681SAndroid Build Coastguard Worker { "DynamicLibrary", MachO::MH_DYLIB },
99*9880d681SAndroid Build Coastguard Worker { "DynamicLinker", MachO::MH_DYLINKER },
100*9880d681SAndroid Build Coastguard Worker { "Bundle", MachO::MH_BUNDLE },
101*9880d681SAndroid Build Coastguard Worker { "DynamicLibraryStub", MachO::MH_DYLIB_STUB },
102*9880d681SAndroid Build Coastguard Worker { "DWARFSymbol", MachO::MH_DSYM },
103*9880d681SAndroid Build Coastguard Worker { "KextBundle", MachO::MH_KEXT_BUNDLE },
104*9880d681SAndroid Build Coastguard Worker };
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker static const EnumEntry<uint32_t> MachOHeaderCpuTypes[] = {
107*9880d681SAndroid Build Coastguard Worker { "Any" , static_cast<uint32_t>(MachO::CPU_TYPE_ANY) },
108*9880d681SAndroid Build Coastguard Worker { "X86" , MachO::CPU_TYPE_X86 },
109*9880d681SAndroid Build Coastguard Worker { "X86-64" , MachO::CPU_TYPE_X86_64 },
110*9880d681SAndroid Build Coastguard Worker { "Mc98000" , MachO::CPU_TYPE_MC98000 },
111*9880d681SAndroid Build Coastguard Worker { "Arm" , MachO::CPU_TYPE_ARM },
112*9880d681SAndroid Build Coastguard Worker { "Arm64" , MachO::CPU_TYPE_ARM64 },
113*9880d681SAndroid Build Coastguard Worker { "Sparc" , MachO::CPU_TYPE_SPARC },
114*9880d681SAndroid Build Coastguard Worker { "PowerPC" , MachO::CPU_TYPE_POWERPC },
115*9880d681SAndroid Build Coastguard Worker { "PowerPC64" , MachO::CPU_TYPE_POWERPC64 },
116*9880d681SAndroid Build Coastguard Worker };
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker static const EnumEntry<uint32_t> MachOHeaderCpuSubtypesX86[] = {
119*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_I386_ALL),
120*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_386),
121*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_486),
122*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_486SX),
123*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_586),
124*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_PENTPRO),
125*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_PENTII_M3),
126*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_PENTII_M5),
127*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_CELERON),
128*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_CELERON_MOBILE),
129*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_PENTIUM_3),
130*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_PENTIUM_3_M),
131*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_PENTIUM_3_XEON),
132*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_PENTIUM_M),
133*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_PENTIUM_4),
134*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_PENTIUM_4_M),
135*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ITANIUM),
136*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ITANIUM_2),
137*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_XEON),
138*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_XEON_MP),
139*9880d681SAndroid Build Coastguard Worker };
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker static const EnumEntry<uint32_t> MachOHeaderCpuSubtypesX64[] = {
142*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_X86_64_ALL),
143*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_X86_ARCH1),
144*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_X86_64_H),
145*9880d681SAndroid Build Coastguard Worker };
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker static const EnumEntry<uint32_t> MachOHeaderCpuSubtypesARM[] = {
148*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_ALL),
149*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V4T),
150*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V6),
151*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V5),
152*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V5TEJ),
153*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_XSCALE),
154*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7),
155*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7S),
156*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7K),
157*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V6M),
158*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7M),
159*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7EM),
160*9880d681SAndroid Build Coastguard Worker };
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker static const EnumEntry<uint32_t> MachOHeaderCpuSubtypesARM64[] = {
163*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_ALL),
164*9880d681SAndroid Build Coastguard Worker };
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker static const EnumEntry<uint32_t> MachOHeaderCpuSubtypesSPARC[] = {
167*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_SPARC_ALL),
168*9880d681SAndroid Build Coastguard Worker };
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker static const EnumEntry<uint32_t> MachOHeaderCpuSubtypesPPC[] = {
171*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_ALL),
172*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_601),
173*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_602),
174*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_603),
175*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_603e),
176*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_603ev),
177*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_604),
178*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_604e),
179*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_620),
180*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_750),
181*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_7400),
182*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_7450),
183*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_POWERPC_970),
184*9880d681SAndroid Build Coastguard Worker };
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker static const EnumEntry<uint32_t> MachOHeaderFlags[] = {
187*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_NOUNDEFS),
188*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_INCRLINK),
189*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_DYLDLINK),
190*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_BINDATLOAD),
191*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_PREBOUND),
192*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_SPLIT_SEGS),
193*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_LAZY_INIT),
194*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_TWOLEVEL),
195*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_FORCE_FLAT),
196*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_NOMULTIDEFS),
197*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_NOFIXPREBINDING),
198*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_PREBINDABLE),
199*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_ALLMODSBOUND),
200*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_SUBSECTIONS_VIA_SYMBOLS),
201*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_CANONICAL),
202*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_WEAK_DEFINES),
203*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_BINDS_TO_WEAK),
204*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_ALLOW_STACK_EXECUTION),
205*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_ROOT_SAFE),
206*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_SETUID_SAFE),
207*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_NO_REEXPORTED_DYLIBS),
208*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_PIE),
209*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_DEAD_STRIPPABLE_DYLIB),
210*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_HAS_TLV_DESCRIPTORS),
211*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_NO_HEAP_EXECUTION),
212*9880d681SAndroid Build Coastguard Worker LLVM_READOBJ_ENUM_ENT(MachO, MH_APP_EXTENSION_SAFE),
213*9880d681SAndroid Build Coastguard Worker };
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Worker static const EnumEntry<unsigned> MachOSectionAttributes[] = {
216*9880d681SAndroid Build Coastguard Worker { "LocReloc" , 1 << 0 /*S_ATTR_LOC_RELOC */ },
217*9880d681SAndroid Build Coastguard Worker { "ExtReloc" , 1 << 1 /*S_ATTR_EXT_RELOC */ },
218*9880d681SAndroid Build Coastguard Worker { "SomeInstructions" , 1 << 2 /*S_ATTR_SOME_INSTRUCTIONS */ },
219*9880d681SAndroid Build Coastguard Worker { "Debug" , 1 << 17 /*S_ATTR_DEBUG */ },
220*9880d681SAndroid Build Coastguard Worker { "SelfModifyingCode", 1 << 18 /*S_ATTR_SELF_MODIFYING_CODE*/ },
221*9880d681SAndroid Build Coastguard Worker { "LiveSupport" , 1 << 19 /*S_ATTR_LIVE_SUPPORT */ },
222*9880d681SAndroid Build Coastguard Worker { "NoDeadStrip" , 1 << 20 /*S_ATTR_NO_DEAD_STRIP */ },
223*9880d681SAndroid Build Coastguard Worker { "StripStaticSyms" , 1 << 21 /*S_ATTR_STRIP_STATIC_SYMS */ },
224*9880d681SAndroid Build Coastguard Worker { "NoTOC" , 1 << 22 /*S_ATTR_NO_TOC */ },
225*9880d681SAndroid Build Coastguard Worker { "PureInstructions" , 1 << 23 /*S_ATTR_PURE_INSTRUCTIONS */ },
226*9880d681SAndroid Build Coastguard Worker };
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker static const EnumEntry<unsigned> MachOSymbolRefTypes[] = {
229*9880d681SAndroid Build Coastguard Worker { "UndefinedNonLazy", 0 },
230*9880d681SAndroid Build Coastguard Worker { "ReferenceFlagUndefinedLazy", 1 },
231*9880d681SAndroid Build Coastguard Worker { "ReferenceFlagDefined", 2 },
232*9880d681SAndroid Build Coastguard Worker { "ReferenceFlagPrivateDefined", 3 },
233*9880d681SAndroid Build Coastguard Worker { "ReferenceFlagPrivateUndefinedNonLazy", 4 },
234*9880d681SAndroid Build Coastguard Worker { "ReferenceFlagPrivateUndefinedLazy", 5 }
235*9880d681SAndroid Build Coastguard Worker };
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker static const EnumEntry<unsigned> MachOSymbolFlags[] = {
238*9880d681SAndroid Build Coastguard Worker { "ReferencedDynamically", 0x10 },
239*9880d681SAndroid Build Coastguard Worker { "NoDeadStrip", 0x20 },
240*9880d681SAndroid Build Coastguard Worker { "WeakRef", 0x40 },
241*9880d681SAndroid Build Coastguard Worker { "WeakDef", 0x80 },
242*9880d681SAndroid Build Coastguard Worker { "AltEntry", 0x200 },
243*9880d681SAndroid Build Coastguard Worker };
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker static const EnumEntry<unsigned> MachOSymbolTypes[] = {
246*9880d681SAndroid Build Coastguard Worker { "Undef", 0x0 },
247*9880d681SAndroid Build Coastguard Worker { "Abs", 0x2 },
248*9880d681SAndroid Build Coastguard Worker { "Indirect", 0xA },
249*9880d681SAndroid Build Coastguard Worker { "PreboundUndef", 0xC },
250*9880d681SAndroid Build Coastguard Worker { "Section", 0xE }
251*9880d681SAndroid Build Coastguard Worker };
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Worker namespace {
254*9880d681SAndroid Build Coastguard Worker struct MachOSection {
255*9880d681SAndroid Build Coastguard Worker ArrayRef<char> Name;
256*9880d681SAndroid Build Coastguard Worker ArrayRef<char> SegmentName;
257*9880d681SAndroid Build Coastguard Worker uint64_t Address;
258*9880d681SAndroid Build Coastguard Worker uint64_t Size;
259*9880d681SAndroid Build Coastguard Worker uint32_t Offset;
260*9880d681SAndroid Build Coastguard Worker uint32_t Alignment;
261*9880d681SAndroid Build Coastguard Worker uint32_t RelocationTableOffset;
262*9880d681SAndroid Build Coastguard Worker uint32_t NumRelocationTableEntries;
263*9880d681SAndroid Build Coastguard Worker uint32_t Flags;
264*9880d681SAndroid Build Coastguard Worker uint32_t Reserved1;
265*9880d681SAndroid Build Coastguard Worker uint32_t Reserved2;
266*9880d681SAndroid Build Coastguard Worker uint32_t Reserved3;
267*9880d681SAndroid Build Coastguard Worker };
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker struct MachOSegment {
270*9880d681SAndroid Build Coastguard Worker std::string CmdName;
271*9880d681SAndroid Build Coastguard Worker std::string SegName;
272*9880d681SAndroid Build Coastguard Worker uint64_t cmdsize;
273*9880d681SAndroid Build Coastguard Worker uint64_t vmaddr;
274*9880d681SAndroid Build Coastguard Worker uint64_t vmsize;
275*9880d681SAndroid Build Coastguard Worker uint64_t fileoff;
276*9880d681SAndroid Build Coastguard Worker uint64_t filesize;
277*9880d681SAndroid Build Coastguard Worker uint32_t maxprot;
278*9880d681SAndroid Build Coastguard Worker uint32_t initprot;
279*9880d681SAndroid Build Coastguard Worker uint32_t nsects;
280*9880d681SAndroid Build Coastguard Worker uint32_t flags;
281*9880d681SAndroid Build Coastguard Worker };
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker struct MachOSymbol {
284*9880d681SAndroid Build Coastguard Worker uint32_t StringIndex;
285*9880d681SAndroid Build Coastguard Worker uint8_t Type;
286*9880d681SAndroid Build Coastguard Worker uint8_t SectionIndex;
287*9880d681SAndroid Build Coastguard Worker uint16_t Flags;
288*9880d681SAndroid Build Coastguard Worker uint64_t Value;
289*9880d681SAndroid Build Coastguard Worker };
290*9880d681SAndroid Build Coastguard Worker }
291*9880d681SAndroid Build Coastguard Worker
getMask(uint32_t prot)292*9880d681SAndroid Build Coastguard Worker static std::string getMask(uint32_t prot)
293*9880d681SAndroid Build Coastguard Worker {
294*9880d681SAndroid Build Coastguard Worker // TODO (davide): This always assumes prot is valid.
295*9880d681SAndroid Build Coastguard Worker // Catch mistakes and report if needed.
296*9880d681SAndroid Build Coastguard Worker std::string Prot;
297*9880d681SAndroid Build Coastguard Worker Prot = "";
298*9880d681SAndroid Build Coastguard Worker Prot += (prot & MachO::VM_PROT_READ) ? "r" : "-";
299*9880d681SAndroid Build Coastguard Worker Prot += (prot & MachO::VM_PROT_WRITE) ? "w" : "-";
300*9880d681SAndroid Build Coastguard Worker Prot += (prot & MachO::VM_PROT_EXECUTE) ? "x" : "-";
301*9880d681SAndroid Build Coastguard Worker return Prot;
302*9880d681SAndroid Build Coastguard Worker }
303*9880d681SAndroid Build Coastguard Worker
getSection(const MachOObjectFile * Obj,DataRefImpl Sec,MachOSection & Section)304*9880d681SAndroid Build Coastguard Worker static void getSection(const MachOObjectFile *Obj,
305*9880d681SAndroid Build Coastguard Worker DataRefImpl Sec,
306*9880d681SAndroid Build Coastguard Worker MachOSection &Section) {
307*9880d681SAndroid Build Coastguard Worker if (!Obj->is64Bit()) {
308*9880d681SAndroid Build Coastguard Worker MachO::section Sect = Obj->getSection(Sec);
309*9880d681SAndroid Build Coastguard Worker Section.Address = Sect.addr;
310*9880d681SAndroid Build Coastguard Worker Section.Size = Sect.size;
311*9880d681SAndroid Build Coastguard Worker Section.Offset = Sect.offset;
312*9880d681SAndroid Build Coastguard Worker Section.Alignment = Sect.align;
313*9880d681SAndroid Build Coastguard Worker Section.RelocationTableOffset = Sect.reloff;
314*9880d681SAndroid Build Coastguard Worker Section.NumRelocationTableEntries = Sect.nreloc;
315*9880d681SAndroid Build Coastguard Worker Section.Flags = Sect.flags;
316*9880d681SAndroid Build Coastguard Worker Section.Reserved1 = Sect.reserved1;
317*9880d681SAndroid Build Coastguard Worker Section.Reserved2 = Sect.reserved2;
318*9880d681SAndroid Build Coastguard Worker return;
319*9880d681SAndroid Build Coastguard Worker }
320*9880d681SAndroid Build Coastguard Worker MachO::section_64 Sect = Obj->getSection64(Sec);
321*9880d681SAndroid Build Coastguard Worker Section.Address = Sect.addr;
322*9880d681SAndroid Build Coastguard Worker Section.Size = Sect.size;
323*9880d681SAndroid Build Coastguard Worker Section.Offset = Sect.offset;
324*9880d681SAndroid Build Coastguard Worker Section.Alignment = Sect.align;
325*9880d681SAndroid Build Coastguard Worker Section.RelocationTableOffset = Sect.reloff;
326*9880d681SAndroid Build Coastguard Worker Section.NumRelocationTableEntries = Sect.nreloc;
327*9880d681SAndroid Build Coastguard Worker Section.Flags = Sect.flags;
328*9880d681SAndroid Build Coastguard Worker Section.Reserved1 = Sect.reserved1;
329*9880d681SAndroid Build Coastguard Worker Section.Reserved2 = Sect.reserved2;
330*9880d681SAndroid Build Coastguard Worker Section.Reserved3 = Sect.reserved3;
331*9880d681SAndroid Build Coastguard Worker }
332*9880d681SAndroid Build Coastguard Worker
getSegment(const MachOObjectFile * Obj,const MachOObjectFile::LoadCommandInfo & L,MachOSegment & Segment)333*9880d681SAndroid Build Coastguard Worker static void getSegment(const MachOObjectFile *Obj,
334*9880d681SAndroid Build Coastguard Worker const MachOObjectFile::LoadCommandInfo &L,
335*9880d681SAndroid Build Coastguard Worker MachOSegment &Segment) {
336*9880d681SAndroid Build Coastguard Worker if (!Obj->is64Bit()) {
337*9880d681SAndroid Build Coastguard Worker MachO::segment_command SC = Obj->getSegmentLoadCommand(L);
338*9880d681SAndroid Build Coastguard Worker Segment.CmdName = "LC_SEGMENT";
339*9880d681SAndroid Build Coastguard Worker Segment.SegName = SC.segname;
340*9880d681SAndroid Build Coastguard Worker Segment.cmdsize = SC.cmdsize;
341*9880d681SAndroid Build Coastguard Worker Segment.vmaddr = SC.vmaddr;
342*9880d681SAndroid Build Coastguard Worker Segment.vmsize = SC.vmsize;
343*9880d681SAndroid Build Coastguard Worker Segment.fileoff = SC.fileoff;
344*9880d681SAndroid Build Coastguard Worker Segment.filesize = SC.filesize;
345*9880d681SAndroid Build Coastguard Worker Segment.maxprot = SC.maxprot;
346*9880d681SAndroid Build Coastguard Worker Segment.initprot = SC.initprot;
347*9880d681SAndroid Build Coastguard Worker Segment.nsects = SC.nsects;
348*9880d681SAndroid Build Coastguard Worker Segment.flags = SC.flags;
349*9880d681SAndroid Build Coastguard Worker return;
350*9880d681SAndroid Build Coastguard Worker }
351*9880d681SAndroid Build Coastguard Worker MachO::segment_command_64 SC = Obj->getSegment64LoadCommand(L);
352*9880d681SAndroid Build Coastguard Worker Segment.CmdName = "LC_SEGMENT_64";
353*9880d681SAndroid Build Coastguard Worker Segment.SegName = SC.segname;
354*9880d681SAndroid Build Coastguard Worker Segment.cmdsize = SC.cmdsize;
355*9880d681SAndroid Build Coastguard Worker Segment.vmaddr = SC.vmaddr;
356*9880d681SAndroid Build Coastguard Worker Segment.vmsize = SC.vmsize;
357*9880d681SAndroid Build Coastguard Worker Segment.fileoff = SC.fileoff;
358*9880d681SAndroid Build Coastguard Worker Segment.filesize = SC.filesize;
359*9880d681SAndroid Build Coastguard Worker Segment.maxprot = SC.maxprot;
360*9880d681SAndroid Build Coastguard Worker Segment.initprot = SC.initprot;
361*9880d681SAndroid Build Coastguard Worker Segment.nsects = SC.nsects;
362*9880d681SAndroid Build Coastguard Worker Segment.flags = SC.flags;
363*9880d681SAndroid Build Coastguard Worker }
364*9880d681SAndroid Build Coastguard Worker
getSymbol(const MachOObjectFile * Obj,DataRefImpl DRI,MachOSymbol & Symbol)365*9880d681SAndroid Build Coastguard Worker static void getSymbol(const MachOObjectFile *Obj,
366*9880d681SAndroid Build Coastguard Worker DataRefImpl DRI,
367*9880d681SAndroid Build Coastguard Worker MachOSymbol &Symbol) {
368*9880d681SAndroid Build Coastguard Worker if (!Obj->is64Bit()) {
369*9880d681SAndroid Build Coastguard Worker MachO::nlist Entry = Obj->getSymbolTableEntry(DRI);
370*9880d681SAndroid Build Coastguard Worker Symbol.StringIndex = Entry.n_strx;
371*9880d681SAndroid Build Coastguard Worker Symbol.Type = Entry.n_type;
372*9880d681SAndroid Build Coastguard Worker Symbol.SectionIndex = Entry.n_sect;
373*9880d681SAndroid Build Coastguard Worker Symbol.Flags = Entry.n_desc;
374*9880d681SAndroid Build Coastguard Worker Symbol.Value = Entry.n_value;
375*9880d681SAndroid Build Coastguard Worker return;
376*9880d681SAndroid Build Coastguard Worker }
377*9880d681SAndroid Build Coastguard Worker MachO::nlist_64 Entry = Obj->getSymbol64TableEntry(DRI);
378*9880d681SAndroid Build Coastguard Worker Symbol.StringIndex = Entry.n_strx;
379*9880d681SAndroid Build Coastguard Worker Symbol.Type = Entry.n_type;
380*9880d681SAndroid Build Coastguard Worker Symbol.SectionIndex = Entry.n_sect;
381*9880d681SAndroid Build Coastguard Worker Symbol.Flags = Entry.n_desc;
382*9880d681SAndroid Build Coastguard Worker Symbol.Value = Entry.n_value;
383*9880d681SAndroid Build Coastguard Worker }
384*9880d681SAndroid Build Coastguard Worker
printFileHeaders()385*9880d681SAndroid Build Coastguard Worker void MachODumper::printFileHeaders() {
386*9880d681SAndroid Build Coastguard Worker DictScope H(W, "MachHeader");
387*9880d681SAndroid Build Coastguard Worker if (!Obj->is64Bit()) {
388*9880d681SAndroid Build Coastguard Worker printFileHeaders(Obj->getHeader());
389*9880d681SAndroid Build Coastguard Worker } else {
390*9880d681SAndroid Build Coastguard Worker printFileHeaders(Obj->getHeader64());
391*9880d681SAndroid Build Coastguard Worker W.printHex("Reserved", Obj->getHeader64().reserved);
392*9880d681SAndroid Build Coastguard Worker }
393*9880d681SAndroid Build Coastguard Worker }
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Worker template<class MachHeader>
printFileHeaders(const MachHeader & Header)396*9880d681SAndroid Build Coastguard Worker void MachODumper::printFileHeaders(const MachHeader &Header) {
397*9880d681SAndroid Build Coastguard Worker W.printEnum("Magic", Header.magic, makeArrayRef(MachOMagics));
398*9880d681SAndroid Build Coastguard Worker W.printEnum("CpuType", Header.cputype, makeArrayRef(MachOHeaderCpuTypes));
399*9880d681SAndroid Build Coastguard Worker uint32_t subtype = Header.cpusubtype & ~MachO::CPU_SUBTYPE_MASK;
400*9880d681SAndroid Build Coastguard Worker switch (Header.cputype) {
401*9880d681SAndroid Build Coastguard Worker case MachO::CPU_TYPE_X86:
402*9880d681SAndroid Build Coastguard Worker W.printEnum("CpuSubType", subtype, makeArrayRef(MachOHeaderCpuSubtypesX86));
403*9880d681SAndroid Build Coastguard Worker break;
404*9880d681SAndroid Build Coastguard Worker case MachO::CPU_TYPE_X86_64:
405*9880d681SAndroid Build Coastguard Worker W.printEnum("CpuSubType", subtype, makeArrayRef(MachOHeaderCpuSubtypesX64));
406*9880d681SAndroid Build Coastguard Worker break;
407*9880d681SAndroid Build Coastguard Worker case MachO::CPU_TYPE_ARM:
408*9880d681SAndroid Build Coastguard Worker W.printEnum("CpuSubType", subtype, makeArrayRef(MachOHeaderCpuSubtypesARM));
409*9880d681SAndroid Build Coastguard Worker break;
410*9880d681SAndroid Build Coastguard Worker case MachO::CPU_TYPE_POWERPC:
411*9880d681SAndroid Build Coastguard Worker W.printEnum("CpuSubType", subtype, makeArrayRef(MachOHeaderCpuSubtypesPPC));
412*9880d681SAndroid Build Coastguard Worker break;
413*9880d681SAndroid Build Coastguard Worker case MachO::CPU_TYPE_SPARC:
414*9880d681SAndroid Build Coastguard Worker W.printEnum("CpuSubType", subtype, makeArrayRef(MachOHeaderCpuSubtypesSPARC));
415*9880d681SAndroid Build Coastguard Worker break;
416*9880d681SAndroid Build Coastguard Worker case MachO::CPU_TYPE_ARM64:
417*9880d681SAndroid Build Coastguard Worker W.printEnum("CpuSubType", subtype, makeArrayRef(MachOHeaderCpuSubtypesARM64));
418*9880d681SAndroid Build Coastguard Worker break;
419*9880d681SAndroid Build Coastguard Worker case MachO::CPU_TYPE_POWERPC64:
420*9880d681SAndroid Build Coastguard Worker default:
421*9880d681SAndroid Build Coastguard Worker W.printHex("CpuSubtype", subtype);
422*9880d681SAndroid Build Coastguard Worker }
423*9880d681SAndroid Build Coastguard Worker W.printEnum("FileType", Header.filetype, makeArrayRef(MachOHeaderFileTypes));
424*9880d681SAndroid Build Coastguard Worker W.printNumber("NumOfLoadCommands", Header.ncmds);
425*9880d681SAndroid Build Coastguard Worker W.printNumber("SizeOfLoadCommands", Header.sizeofcmds);
426*9880d681SAndroid Build Coastguard Worker W.printFlags("Flags", Header.flags, makeArrayRef(MachOHeaderFlags));
427*9880d681SAndroid Build Coastguard Worker }
428*9880d681SAndroid Build Coastguard Worker
printSections()429*9880d681SAndroid Build Coastguard Worker void MachODumper::printSections() {
430*9880d681SAndroid Build Coastguard Worker return printSections(Obj);
431*9880d681SAndroid Build Coastguard Worker }
432*9880d681SAndroid Build Coastguard Worker
printSections(const MachOObjectFile * Obj)433*9880d681SAndroid Build Coastguard Worker void MachODumper::printSections(const MachOObjectFile *Obj) {
434*9880d681SAndroid Build Coastguard Worker ListScope Group(W, "Sections");
435*9880d681SAndroid Build Coastguard Worker
436*9880d681SAndroid Build Coastguard Worker int SectionIndex = -1;
437*9880d681SAndroid Build Coastguard Worker for (const SectionRef &Section : Obj->sections()) {
438*9880d681SAndroid Build Coastguard Worker ++SectionIndex;
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Worker MachOSection MOSection;
441*9880d681SAndroid Build Coastguard Worker getSection(Obj, Section.getRawDataRefImpl(), MOSection);
442*9880d681SAndroid Build Coastguard Worker DataRefImpl DR = Section.getRawDataRefImpl();
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Worker StringRef Name;
445*9880d681SAndroid Build Coastguard Worker error(Section.getName(Name));
446*9880d681SAndroid Build Coastguard Worker
447*9880d681SAndroid Build Coastguard Worker ArrayRef<char> RawName = Obj->getSectionRawName(DR);
448*9880d681SAndroid Build Coastguard Worker StringRef SegmentName = Obj->getSectionFinalSegmentName(DR);
449*9880d681SAndroid Build Coastguard Worker ArrayRef<char> RawSegmentName = Obj->getSectionRawFinalSegmentName(DR);
450*9880d681SAndroid Build Coastguard Worker
451*9880d681SAndroid Build Coastguard Worker DictScope SectionD(W, "Section");
452*9880d681SAndroid Build Coastguard Worker W.printNumber("Index", SectionIndex);
453*9880d681SAndroid Build Coastguard Worker W.printBinary("Name", Name, RawName);
454*9880d681SAndroid Build Coastguard Worker W.printBinary("Segment", SegmentName, RawSegmentName);
455*9880d681SAndroid Build Coastguard Worker W.printHex("Address", MOSection.Address);
456*9880d681SAndroid Build Coastguard Worker W.printHex("Size", MOSection.Size);
457*9880d681SAndroid Build Coastguard Worker W.printNumber("Offset", MOSection.Offset);
458*9880d681SAndroid Build Coastguard Worker W.printNumber("Alignment", MOSection.Alignment);
459*9880d681SAndroid Build Coastguard Worker W.printHex("RelocationOffset", MOSection.RelocationTableOffset);
460*9880d681SAndroid Build Coastguard Worker W.printNumber("RelocationCount", MOSection.NumRelocationTableEntries);
461*9880d681SAndroid Build Coastguard Worker W.printEnum("Type", MOSection.Flags & 0xFF,
462*9880d681SAndroid Build Coastguard Worker makeArrayRef(MachOSectionAttributes));
463*9880d681SAndroid Build Coastguard Worker W.printFlags("Attributes", MOSection.Flags >> 8,
464*9880d681SAndroid Build Coastguard Worker makeArrayRef(MachOSectionAttributes));
465*9880d681SAndroid Build Coastguard Worker W.printHex("Reserved1", MOSection.Reserved1);
466*9880d681SAndroid Build Coastguard Worker W.printHex("Reserved2", MOSection.Reserved2);
467*9880d681SAndroid Build Coastguard Worker if (Obj->is64Bit())
468*9880d681SAndroid Build Coastguard Worker W.printHex("Reserved3", MOSection.Reserved3);
469*9880d681SAndroid Build Coastguard Worker
470*9880d681SAndroid Build Coastguard Worker if (opts::SectionRelocations) {
471*9880d681SAndroid Build Coastguard Worker ListScope D(W, "Relocations");
472*9880d681SAndroid Build Coastguard Worker for (const RelocationRef &Reloc : Section.relocations())
473*9880d681SAndroid Build Coastguard Worker printRelocation(Reloc);
474*9880d681SAndroid Build Coastguard Worker }
475*9880d681SAndroid Build Coastguard Worker
476*9880d681SAndroid Build Coastguard Worker if (opts::SectionSymbols) {
477*9880d681SAndroid Build Coastguard Worker ListScope D(W, "Symbols");
478*9880d681SAndroid Build Coastguard Worker for (const SymbolRef &Symbol : Obj->symbols()) {
479*9880d681SAndroid Build Coastguard Worker if (!Section.containsSymbol(Symbol))
480*9880d681SAndroid Build Coastguard Worker continue;
481*9880d681SAndroid Build Coastguard Worker
482*9880d681SAndroid Build Coastguard Worker printSymbol(Symbol);
483*9880d681SAndroid Build Coastguard Worker }
484*9880d681SAndroid Build Coastguard Worker }
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Worker if (opts::SectionData) {
487*9880d681SAndroid Build Coastguard Worker bool IsBSS = Section.isBSS();
488*9880d681SAndroid Build Coastguard Worker if (!IsBSS) {
489*9880d681SAndroid Build Coastguard Worker StringRef Data;
490*9880d681SAndroid Build Coastguard Worker error(Section.getContents(Data));
491*9880d681SAndroid Build Coastguard Worker
492*9880d681SAndroid Build Coastguard Worker W.printBinaryBlock("SectionData", Data);
493*9880d681SAndroid Build Coastguard Worker }
494*9880d681SAndroid Build Coastguard Worker }
495*9880d681SAndroid Build Coastguard Worker }
496*9880d681SAndroid Build Coastguard Worker }
497*9880d681SAndroid Build Coastguard Worker
printRelocations()498*9880d681SAndroid Build Coastguard Worker void MachODumper::printRelocations() {
499*9880d681SAndroid Build Coastguard Worker ListScope D(W, "Relocations");
500*9880d681SAndroid Build Coastguard Worker
501*9880d681SAndroid Build Coastguard Worker std::error_code EC;
502*9880d681SAndroid Build Coastguard Worker for (const SectionRef &Section : Obj->sections()) {
503*9880d681SAndroid Build Coastguard Worker StringRef Name;
504*9880d681SAndroid Build Coastguard Worker error(Section.getName(Name));
505*9880d681SAndroid Build Coastguard Worker
506*9880d681SAndroid Build Coastguard Worker bool PrintedGroup = false;
507*9880d681SAndroid Build Coastguard Worker for (const RelocationRef &Reloc : Section.relocations()) {
508*9880d681SAndroid Build Coastguard Worker if (!PrintedGroup) {
509*9880d681SAndroid Build Coastguard Worker W.startLine() << "Section " << Name << " {\n";
510*9880d681SAndroid Build Coastguard Worker W.indent();
511*9880d681SAndroid Build Coastguard Worker PrintedGroup = true;
512*9880d681SAndroid Build Coastguard Worker }
513*9880d681SAndroid Build Coastguard Worker
514*9880d681SAndroid Build Coastguard Worker printRelocation(Reloc);
515*9880d681SAndroid Build Coastguard Worker }
516*9880d681SAndroid Build Coastguard Worker
517*9880d681SAndroid Build Coastguard Worker if (PrintedGroup) {
518*9880d681SAndroid Build Coastguard Worker W.unindent();
519*9880d681SAndroid Build Coastguard Worker W.startLine() << "}\n";
520*9880d681SAndroid Build Coastguard Worker }
521*9880d681SAndroid Build Coastguard Worker }
522*9880d681SAndroid Build Coastguard Worker }
523*9880d681SAndroid Build Coastguard Worker
printRelocation(const RelocationRef & Reloc)524*9880d681SAndroid Build Coastguard Worker void MachODumper::printRelocation(const RelocationRef &Reloc) {
525*9880d681SAndroid Build Coastguard Worker return printRelocation(Obj, Reloc);
526*9880d681SAndroid Build Coastguard Worker }
527*9880d681SAndroid Build Coastguard Worker
printRelocation(const MachOObjectFile * Obj,const RelocationRef & Reloc)528*9880d681SAndroid Build Coastguard Worker void MachODumper::printRelocation(const MachOObjectFile *Obj,
529*9880d681SAndroid Build Coastguard Worker const RelocationRef &Reloc) {
530*9880d681SAndroid Build Coastguard Worker uint64_t Offset = Reloc.getOffset();
531*9880d681SAndroid Build Coastguard Worker SmallString<32> RelocName;
532*9880d681SAndroid Build Coastguard Worker Reloc.getTypeName(RelocName);
533*9880d681SAndroid Build Coastguard Worker
534*9880d681SAndroid Build Coastguard Worker DataRefImpl DR = Reloc.getRawDataRefImpl();
535*9880d681SAndroid Build Coastguard Worker MachO::any_relocation_info RE = Obj->getRelocation(DR);
536*9880d681SAndroid Build Coastguard Worker bool IsScattered = Obj->isRelocationScattered(RE);
537*9880d681SAndroid Build Coastguard Worker bool IsExtern = !IsScattered && Obj->getPlainRelocationExternal(RE);
538*9880d681SAndroid Build Coastguard Worker
539*9880d681SAndroid Build Coastguard Worker StringRef TargetName;
540*9880d681SAndroid Build Coastguard Worker if (IsExtern) {
541*9880d681SAndroid Build Coastguard Worker symbol_iterator Symbol = Reloc.getSymbol();
542*9880d681SAndroid Build Coastguard Worker if (Symbol != Obj->symbol_end()) {
543*9880d681SAndroid Build Coastguard Worker Expected<StringRef> TargetNameOrErr = Symbol->getName();
544*9880d681SAndroid Build Coastguard Worker if (!TargetNameOrErr)
545*9880d681SAndroid Build Coastguard Worker error(errorToErrorCode(TargetNameOrErr.takeError()));
546*9880d681SAndroid Build Coastguard Worker TargetName = *TargetNameOrErr;
547*9880d681SAndroid Build Coastguard Worker }
548*9880d681SAndroid Build Coastguard Worker } else if (!IsScattered) {
549*9880d681SAndroid Build Coastguard Worker section_iterator SecI = Obj->getRelocationSection(DR);
550*9880d681SAndroid Build Coastguard Worker if (SecI != Obj->section_end()) {
551*9880d681SAndroid Build Coastguard Worker error(SecI->getName(TargetName));
552*9880d681SAndroid Build Coastguard Worker }
553*9880d681SAndroid Build Coastguard Worker }
554*9880d681SAndroid Build Coastguard Worker if (TargetName.empty())
555*9880d681SAndroid Build Coastguard Worker TargetName = "-";
556*9880d681SAndroid Build Coastguard Worker
557*9880d681SAndroid Build Coastguard Worker if (opts::ExpandRelocs) {
558*9880d681SAndroid Build Coastguard Worker DictScope Group(W, "Relocation");
559*9880d681SAndroid Build Coastguard Worker W.printHex("Offset", Offset);
560*9880d681SAndroid Build Coastguard Worker W.printNumber("PCRel", Obj->getAnyRelocationPCRel(RE));
561*9880d681SAndroid Build Coastguard Worker W.printNumber("Length", Obj->getAnyRelocationLength(RE));
562*9880d681SAndroid Build Coastguard Worker W.printNumber("Type", RelocName, Obj->getAnyRelocationType(RE));
563*9880d681SAndroid Build Coastguard Worker if (IsScattered) {
564*9880d681SAndroid Build Coastguard Worker W.printHex("Value", Obj->getScatteredRelocationValue(RE));
565*9880d681SAndroid Build Coastguard Worker } else {
566*9880d681SAndroid Build Coastguard Worker const char *Kind = IsExtern ? "Symbol" : "Section";
567*9880d681SAndroid Build Coastguard Worker W.printNumber(Kind, TargetName, Obj->getPlainRelocationSymbolNum(RE));
568*9880d681SAndroid Build Coastguard Worker }
569*9880d681SAndroid Build Coastguard Worker } else {
570*9880d681SAndroid Build Coastguard Worker SmallString<32> SymbolNameOrOffset("0x");
571*9880d681SAndroid Build Coastguard Worker if (IsScattered) {
572*9880d681SAndroid Build Coastguard Worker // Scattered relocations don't really have an associated symbol for some
573*9880d681SAndroid Build Coastguard Worker // reason, even if one exists in the symtab at the correct address.
574*9880d681SAndroid Build Coastguard Worker SymbolNameOrOffset += utohexstr(Obj->getScatteredRelocationValue(RE));
575*9880d681SAndroid Build Coastguard Worker } else {
576*9880d681SAndroid Build Coastguard Worker SymbolNameOrOffset = TargetName;
577*9880d681SAndroid Build Coastguard Worker }
578*9880d681SAndroid Build Coastguard Worker
579*9880d681SAndroid Build Coastguard Worker raw_ostream& OS = W.startLine();
580*9880d681SAndroid Build Coastguard Worker OS << W.hex(Offset)
581*9880d681SAndroid Build Coastguard Worker << " " << Obj->getAnyRelocationPCRel(RE)
582*9880d681SAndroid Build Coastguard Worker << " " << Obj->getAnyRelocationLength(RE);
583*9880d681SAndroid Build Coastguard Worker if (IsScattered)
584*9880d681SAndroid Build Coastguard Worker OS << " n/a";
585*9880d681SAndroid Build Coastguard Worker else
586*9880d681SAndroid Build Coastguard Worker OS << " " << Obj->getPlainRelocationExternal(RE);
587*9880d681SAndroid Build Coastguard Worker OS << " " << RelocName
588*9880d681SAndroid Build Coastguard Worker << " " << IsScattered
589*9880d681SAndroid Build Coastguard Worker << " " << SymbolNameOrOffset
590*9880d681SAndroid Build Coastguard Worker << "\n";
591*9880d681SAndroid Build Coastguard Worker }
592*9880d681SAndroid Build Coastguard Worker }
593*9880d681SAndroid Build Coastguard Worker
printSymbols()594*9880d681SAndroid Build Coastguard Worker void MachODumper::printSymbols() {
595*9880d681SAndroid Build Coastguard Worker ListScope Group(W, "Symbols");
596*9880d681SAndroid Build Coastguard Worker
597*9880d681SAndroid Build Coastguard Worker for (const SymbolRef &Symbol : Obj->symbols()) {
598*9880d681SAndroid Build Coastguard Worker printSymbol(Symbol);
599*9880d681SAndroid Build Coastguard Worker }
600*9880d681SAndroid Build Coastguard Worker }
601*9880d681SAndroid Build Coastguard Worker
printDynamicSymbols()602*9880d681SAndroid Build Coastguard Worker void MachODumper::printDynamicSymbols() {
603*9880d681SAndroid Build Coastguard Worker ListScope Group(W, "DynamicSymbols");
604*9880d681SAndroid Build Coastguard Worker }
605*9880d681SAndroid Build Coastguard Worker
printSymbol(const SymbolRef & Symbol)606*9880d681SAndroid Build Coastguard Worker void MachODumper::printSymbol(const SymbolRef &Symbol) {
607*9880d681SAndroid Build Coastguard Worker StringRef SymbolName;
608*9880d681SAndroid Build Coastguard Worker Expected<StringRef> SymbolNameOrErr = Symbol.getName();
609*9880d681SAndroid Build Coastguard Worker if (!SymbolNameOrErr) {
610*9880d681SAndroid Build Coastguard Worker // TODO: Actually report errors helpfully.
611*9880d681SAndroid Build Coastguard Worker consumeError(SymbolNameOrErr.takeError());
612*9880d681SAndroid Build Coastguard Worker } else
613*9880d681SAndroid Build Coastguard Worker SymbolName = *SymbolNameOrErr;
614*9880d681SAndroid Build Coastguard Worker
615*9880d681SAndroid Build Coastguard Worker MachOSymbol MOSymbol;
616*9880d681SAndroid Build Coastguard Worker getSymbol(Obj, Symbol.getRawDataRefImpl(), MOSymbol);
617*9880d681SAndroid Build Coastguard Worker
618*9880d681SAndroid Build Coastguard Worker StringRef SectionName = "";
619*9880d681SAndroid Build Coastguard Worker Expected<section_iterator> SecIOrErr = Symbol.getSection();
620*9880d681SAndroid Build Coastguard Worker error(errorToErrorCode(SecIOrErr.takeError()));
621*9880d681SAndroid Build Coastguard Worker section_iterator SecI = *SecIOrErr;
622*9880d681SAndroid Build Coastguard Worker if (SecI != Obj->section_end())
623*9880d681SAndroid Build Coastguard Worker error(SecI->getName(SectionName));
624*9880d681SAndroid Build Coastguard Worker
625*9880d681SAndroid Build Coastguard Worker DictScope D(W, "Symbol");
626*9880d681SAndroid Build Coastguard Worker W.printNumber("Name", SymbolName, MOSymbol.StringIndex);
627*9880d681SAndroid Build Coastguard Worker if (MOSymbol.Type & MachO::N_STAB) {
628*9880d681SAndroid Build Coastguard Worker W.printHex("Type", "SymDebugTable", MOSymbol.Type);
629*9880d681SAndroid Build Coastguard Worker } else {
630*9880d681SAndroid Build Coastguard Worker if (MOSymbol.Type & MachO::N_PEXT)
631*9880d681SAndroid Build Coastguard Worker W.startLine() << "PrivateExtern\n";
632*9880d681SAndroid Build Coastguard Worker if (MOSymbol.Type & MachO::N_EXT)
633*9880d681SAndroid Build Coastguard Worker W.startLine() << "Extern\n";
634*9880d681SAndroid Build Coastguard Worker W.printEnum("Type", uint8_t(MOSymbol.Type & MachO::N_TYPE),
635*9880d681SAndroid Build Coastguard Worker makeArrayRef(MachOSymbolTypes));
636*9880d681SAndroid Build Coastguard Worker }
637*9880d681SAndroid Build Coastguard Worker W.printHex("Section", SectionName, MOSymbol.SectionIndex);
638*9880d681SAndroid Build Coastguard Worker W.printEnum("RefType", static_cast<uint16_t>(MOSymbol.Flags & 0xF),
639*9880d681SAndroid Build Coastguard Worker makeArrayRef(MachOSymbolRefTypes));
640*9880d681SAndroid Build Coastguard Worker W.printFlags("Flags", static_cast<uint16_t>(MOSymbol.Flags & ~0xF),
641*9880d681SAndroid Build Coastguard Worker makeArrayRef(MachOSymbolFlags));
642*9880d681SAndroid Build Coastguard Worker W.printHex("Value", MOSymbol.Value);
643*9880d681SAndroid Build Coastguard Worker }
644*9880d681SAndroid Build Coastguard Worker
printUnwindInfo()645*9880d681SAndroid Build Coastguard Worker void MachODumper::printUnwindInfo() {
646*9880d681SAndroid Build Coastguard Worker W.startLine() << "UnwindInfo not implemented.\n";
647*9880d681SAndroid Build Coastguard Worker }
648*9880d681SAndroid Build Coastguard Worker
printStackMap() const649*9880d681SAndroid Build Coastguard Worker void MachODumper::printStackMap() const {
650*9880d681SAndroid Build Coastguard Worker object::SectionRef StackMapSection;
651*9880d681SAndroid Build Coastguard Worker for (auto Sec : Obj->sections()) {
652*9880d681SAndroid Build Coastguard Worker StringRef Name;
653*9880d681SAndroid Build Coastguard Worker Sec.getName(Name);
654*9880d681SAndroid Build Coastguard Worker if (Name == "__llvm_stackmaps") {
655*9880d681SAndroid Build Coastguard Worker StackMapSection = Sec;
656*9880d681SAndroid Build Coastguard Worker break;
657*9880d681SAndroid Build Coastguard Worker }
658*9880d681SAndroid Build Coastguard Worker }
659*9880d681SAndroid Build Coastguard Worker
660*9880d681SAndroid Build Coastguard Worker if (StackMapSection == object::SectionRef())
661*9880d681SAndroid Build Coastguard Worker return;
662*9880d681SAndroid Build Coastguard Worker
663*9880d681SAndroid Build Coastguard Worker StringRef StackMapContents;
664*9880d681SAndroid Build Coastguard Worker StackMapSection.getContents(StackMapContents);
665*9880d681SAndroid Build Coastguard Worker ArrayRef<uint8_t> StackMapContentsArray(
666*9880d681SAndroid Build Coastguard Worker reinterpret_cast<const uint8_t*>(StackMapContents.data()),
667*9880d681SAndroid Build Coastguard Worker StackMapContents.size());
668*9880d681SAndroid Build Coastguard Worker
669*9880d681SAndroid Build Coastguard Worker if (Obj->isLittleEndian())
670*9880d681SAndroid Build Coastguard Worker prettyPrintStackMap(
671*9880d681SAndroid Build Coastguard Worker llvm::outs(),
672*9880d681SAndroid Build Coastguard Worker StackMapV1Parser<support::little>(StackMapContentsArray));
673*9880d681SAndroid Build Coastguard Worker else
674*9880d681SAndroid Build Coastguard Worker prettyPrintStackMap(llvm::outs(),
675*9880d681SAndroid Build Coastguard Worker StackMapV1Parser<support::big>(StackMapContentsArray));
676*9880d681SAndroid Build Coastguard Worker }
677*9880d681SAndroid Build Coastguard Worker
printMachODataInCode()678*9880d681SAndroid Build Coastguard Worker void MachODumper::printMachODataInCode() {
679*9880d681SAndroid Build Coastguard Worker for (const auto &Load : Obj->load_commands()) {
680*9880d681SAndroid Build Coastguard Worker if (Load.C.cmd == MachO::LC_DATA_IN_CODE) {
681*9880d681SAndroid Build Coastguard Worker MachO::linkedit_data_command LLC = Obj->getLinkeditDataLoadCommand(Load);
682*9880d681SAndroid Build Coastguard Worker DictScope Group(W, "DataInCode");
683*9880d681SAndroid Build Coastguard Worker W.printNumber("Data offset", LLC.dataoff);
684*9880d681SAndroid Build Coastguard Worker W.printNumber("Data size", LLC.datasize);
685*9880d681SAndroid Build Coastguard Worker ListScope D(W, "Data entries");
686*9880d681SAndroid Build Coastguard Worker unsigned NumRegions = LLC.datasize / sizeof(MachO::data_in_code_entry);
687*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < NumRegions; ++i) {
688*9880d681SAndroid Build Coastguard Worker MachO::data_in_code_entry DICE = Obj->getDataInCodeTableEntry(
689*9880d681SAndroid Build Coastguard Worker LLC.dataoff, i);
690*9880d681SAndroid Build Coastguard Worker DictScope Group(W, "Entry");
691*9880d681SAndroid Build Coastguard Worker W.printNumber("Index", i);
692*9880d681SAndroid Build Coastguard Worker W.printNumber("Offset", DICE.offset);
693*9880d681SAndroid Build Coastguard Worker W.printNumber("Length", DICE.length);
694*9880d681SAndroid Build Coastguard Worker W.printNumber("Kind", DICE.kind);
695*9880d681SAndroid Build Coastguard Worker }
696*9880d681SAndroid Build Coastguard Worker }
697*9880d681SAndroid Build Coastguard Worker }
698*9880d681SAndroid Build Coastguard Worker }
699*9880d681SAndroid Build Coastguard Worker
printMachOVersionMin()700*9880d681SAndroid Build Coastguard Worker void MachODumper::printMachOVersionMin() {
701*9880d681SAndroid Build Coastguard Worker for (const auto &Load : Obj->load_commands()) {
702*9880d681SAndroid Build Coastguard Worker StringRef Cmd;
703*9880d681SAndroid Build Coastguard Worker switch (Load.C.cmd) {
704*9880d681SAndroid Build Coastguard Worker case MachO::LC_VERSION_MIN_MACOSX:
705*9880d681SAndroid Build Coastguard Worker Cmd = "LC_VERSION_MIN_MACOSX";
706*9880d681SAndroid Build Coastguard Worker break;
707*9880d681SAndroid Build Coastguard Worker case MachO::LC_VERSION_MIN_IPHONEOS:
708*9880d681SAndroid Build Coastguard Worker Cmd = "LC_VERSION_MIN_IPHONEOS";
709*9880d681SAndroid Build Coastguard Worker break;
710*9880d681SAndroid Build Coastguard Worker case MachO::LC_VERSION_MIN_TVOS:
711*9880d681SAndroid Build Coastguard Worker Cmd = "LC_VERSION_MIN_TVOS";
712*9880d681SAndroid Build Coastguard Worker break;
713*9880d681SAndroid Build Coastguard Worker case MachO::LC_VERSION_MIN_WATCHOS:
714*9880d681SAndroid Build Coastguard Worker Cmd = "LC_VERSION_MIN_WATCHOS";
715*9880d681SAndroid Build Coastguard Worker break;
716*9880d681SAndroid Build Coastguard Worker default:
717*9880d681SAndroid Build Coastguard Worker continue;
718*9880d681SAndroid Build Coastguard Worker }
719*9880d681SAndroid Build Coastguard Worker
720*9880d681SAndroid Build Coastguard Worker MachO::version_min_command VMC = Obj->getVersionMinLoadCommand(Load);
721*9880d681SAndroid Build Coastguard Worker DictScope Group(W, "MinVersion");
722*9880d681SAndroid Build Coastguard Worker W.printString("Cmd", Cmd);
723*9880d681SAndroid Build Coastguard Worker W.printNumber("Size", VMC.cmdsize);
724*9880d681SAndroid Build Coastguard Worker SmallString<32> Version;
725*9880d681SAndroid Build Coastguard Worker Version = utostr(MachOObjectFile::getVersionMinMajor(VMC, false)) + "." +
726*9880d681SAndroid Build Coastguard Worker utostr(MachOObjectFile::getVersionMinMinor(VMC, false));
727*9880d681SAndroid Build Coastguard Worker uint32_t Update = MachOObjectFile::getVersionMinUpdate(VMC, false);
728*9880d681SAndroid Build Coastguard Worker if (Update != 0)
729*9880d681SAndroid Build Coastguard Worker Version += "." + utostr(MachOObjectFile::getVersionMinUpdate(VMC, false));
730*9880d681SAndroid Build Coastguard Worker W.printString("Version", Version);
731*9880d681SAndroid Build Coastguard Worker SmallString<32> SDK;
732*9880d681SAndroid Build Coastguard Worker if (VMC.sdk == 0)
733*9880d681SAndroid Build Coastguard Worker SDK = "n/a";
734*9880d681SAndroid Build Coastguard Worker else {
735*9880d681SAndroid Build Coastguard Worker SDK = utostr(MachOObjectFile::getVersionMinMajor(VMC, true)) + "." +
736*9880d681SAndroid Build Coastguard Worker utostr(MachOObjectFile::getVersionMinMinor(VMC, true));
737*9880d681SAndroid Build Coastguard Worker uint32_t Update = MachOObjectFile::getVersionMinUpdate(VMC, true);
738*9880d681SAndroid Build Coastguard Worker if (Update != 0)
739*9880d681SAndroid Build Coastguard Worker SDK += "." + utostr(MachOObjectFile::getVersionMinUpdate(VMC, true));
740*9880d681SAndroid Build Coastguard Worker }
741*9880d681SAndroid Build Coastguard Worker W.printString("SDK", SDK);
742*9880d681SAndroid Build Coastguard Worker }
743*9880d681SAndroid Build Coastguard Worker }
744*9880d681SAndroid Build Coastguard Worker
printMachODysymtab()745*9880d681SAndroid Build Coastguard Worker void MachODumper::printMachODysymtab() {
746*9880d681SAndroid Build Coastguard Worker for (const auto &Load : Obj->load_commands()) {
747*9880d681SAndroid Build Coastguard Worker if (Load.C.cmd == MachO::LC_DYSYMTAB) {
748*9880d681SAndroid Build Coastguard Worker MachO::dysymtab_command DLC = Obj->getDysymtabLoadCommand();
749*9880d681SAndroid Build Coastguard Worker DictScope Group(W, "Dysymtab");
750*9880d681SAndroid Build Coastguard Worker W.printNumber("ilocalsym", DLC.ilocalsym);
751*9880d681SAndroid Build Coastguard Worker W.printNumber("nlocalsym", DLC.nlocalsym);
752*9880d681SAndroid Build Coastguard Worker W.printNumber("iextdefsym", DLC.iextdefsym);
753*9880d681SAndroid Build Coastguard Worker W.printNumber("nextdefsym", DLC.nextdefsym);
754*9880d681SAndroid Build Coastguard Worker W.printNumber("iundefsym", DLC.iundefsym);
755*9880d681SAndroid Build Coastguard Worker W.printNumber("nundefsym", DLC.nundefsym);
756*9880d681SAndroid Build Coastguard Worker W.printNumber("tocoff", DLC.tocoff);
757*9880d681SAndroid Build Coastguard Worker W.printNumber("ntoc", DLC.ntoc);
758*9880d681SAndroid Build Coastguard Worker W.printNumber("modtaboff", DLC.modtaboff);
759*9880d681SAndroid Build Coastguard Worker W.printNumber("nmodtab", DLC.nmodtab);
760*9880d681SAndroid Build Coastguard Worker W.printNumber("extrefsymoff", DLC.extrefsymoff);
761*9880d681SAndroid Build Coastguard Worker W.printNumber("nextrefsyms", DLC.nextrefsyms);
762*9880d681SAndroid Build Coastguard Worker W.printNumber("indirectsymoff", DLC.indirectsymoff);
763*9880d681SAndroid Build Coastguard Worker W.printNumber("nindirectsyms", DLC.nindirectsyms);
764*9880d681SAndroid Build Coastguard Worker W.printNumber("extreloff", DLC.extreloff);
765*9880d681SAndroid Build Coastguard Worker W.printNumber("nextrel", DLC.nextrel);
766*9880d681SAndroid Build Coastguard Worker W.printNumber("locreloff", DLC.locreloff);
767*9880d681SAndroid Build Coastguard Worker W.printNumber("nlocrel", DLC.nlocrel);
768*9880d681SAndroid Build Coastguard Worker }
769*9880d681SAndroid Build Coastguard Worker }
770*9880d681SAndroid Build Coastguard Worker }
771*9880d681SAndroid Build Coastguard Worker
printMachOSegment()772*9880d681SAndroid Build Coastguard Worker void MachODumper::printMachOSegment() {
773*9880d681SAndroid Build Coastguard Worker for (const auto &Load : Obj->load_commands()) {
774*9880d681SAndroid Build Coastguard Worker if (Load.C.cmd == MachO::LC_SEGMENT || Load.C.cmd == MachO::LC_SEGMENT_64) {
775*9880d681SAndroid Build Coastguard Worker MachOSegment MOSegment;
776*9880d681SAndroid Build Coastguard Worker getSegment(Obj, Load, MOSegment);
777*9880d681SAndroid Build Coastguard Worker DictScope Group(W, "Segment");
778*9880d681SAndroid Build Coastguard Worker W.printString("Cmd", MOSegment.CmdName);
779*9880d681SAndroid Build Coastguard Worker W.printString("Name", MOSegment.SegName);
780*9880d681SAndroid Build Coastguard Worker W.printNumber("Size", MOSegment.cmdsize);
781*9880d681SAndroid Build Coastguard Worker W.printHex("vmaddr", MOSegment.vmaddr);
782*9880d681SAndroid Build Coastguard Worker W.printHex("vmsize", MOSegment.vmsize);
783*9880d681SAndroid Build Coastguard Worker W.printNumber("fileoff", MOSegment.fileoff);
784*9880d681SAndroid Build Coastguard Worker W.printNumber("filesize", MOSegment.filesize);
785*9880d681SAndroid Build Coastguard Worker W.printString("maxprot", getMask(MOSegment.maxprot));
786*9880d681SAndroid Build Coastguard Worker W.printString("initprot", getMask(MOSegment.initprot));
787*9880d681SAndroid Build Coastguard Worker W.printNumber("nsects", MOSegment.nsects);
788*9880d681SAndroid Build Coastguard Worker W.printHex("flags", MOSegment.flags);
789*9880d681SAndroid Build Coastguard Worker }
790*9880d681SAndroid Build Coastguard Worker }
791*9880d681SAndroid Build Coastguard Worker }
792*9880d681SAndroid Build Coastguard Worker
printMachOIndirectSymbols()793*9880d681SAndroid Build Coastguard Worker void MachODumper::printMachOIndirectSymbols() {
794*9880d681SAndroid Build Coastguard Worker for (const auto &Load : Obj->load_commands()) {
795*9880d681SAndroid Build Coastguard Worker if (Load.C.cmd == MachO::LC_DYSYMTAB) {
796*9880d681SAndroid Build Coastguard Worker MachO::dysymtab_command DLC = Obj->getDysymtabLoadCommand();
797*9880d681SAndroid Build Coastguard Worker DictScope Group(W, "Indirect Symbols");
798*9880d681SAndroid Build Coastguard Worker W.printNumber("Number", DLC.nindirectsyms);
799*9880d681SAndroid Build Coastguard Worker ListScope D(W, "Symbols");
800*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < DLC.nindirectsyms; ++i) {
801*9880d681SAndroid Build Coastguard Worker DictScope Group(W, "Entry");
802*9880d681SAndroid Build Coastguard Worker W.printNumber("Entry Index", i);
803*9880d681SAndroid Build Coastguard Worker W.printHex("Symbol Index", Obj->getIndirectSymbolTableEntry(DLC, i));
804*9880d681SAndroid Build Coastguard Worker }
805*9880d681SAndroid Build Coastguard Worker }
806*9880d681SAndroid Build Coastguard Worker }
807*9880d681SAndroid Build Coastguard Worker }
808*9880d681SAndroid Build Coastguard Worker
printMachOLinkerOptions()809*9880d681SAndroid Build Coastguard Worker void MachODumper::printMachOLinkerOptions() {
810*9880d681SAndroid Build Coastguard Worker for (const auto &Load : Obj->load_commands()) {
811*9880d681SAndroid Build Coastguard Worker if (Load.C.cmd == MachO::LC_LINKER_OPTION) {
812*9880d681SAndroid Build Coastguard Worker MachO::linker_option_command LOLC = Obj->getLinkerOptionLoadCommand(Load);
813*9880d681SAndroid Build Coastguard Worker DictScope Group(W, "Linker Options");
814*9880d681SAndroid Build Coastguard Worker W.printNumber("Size", LOLC.cmdsize);
815*9880d681SAndroid Build Coastguard Worker ListScope D(W, "Strings");
816*9880d681SAndroid Build Coastguard Worker uint64_t DataSize = LOLC.cmdsize - sizeof(MachO::linker_option_command);
817*9880d681SAndroid Build Coastguard Worker const char *P = Load.Ptr + sizeof(MachO::linker_option_command);
818*9880d681SAndroid Build Coastguard Worker StringRef Data(P, DataSize);
819*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < LOLC.count; ++i) {
820*9880d681SAndroid Build Coastguard Worker std::pair<StringRef,StringRef> Split = Data.split('\0');
821*9880d681SAndroid Build Coastguard Worker W.printString("Value", Split.first);
822*9880d681SAndroid Build Coastguard Worker Data = Split.second;
823*9880d681SAndroid Build Coastguard Worker }
824*9880d681SAndroid Build Coastguard Worker }
825*9880d681SAndroid Build Coastguard Worker }
826*9880d681SAndroid Build Coastguard Worker }
827