ELFDumper.cpp 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626
  1. //===-- ELFDumper.cpp - ELF-specific dumper ---------------------*- C++ -*-===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. ///
  10. /// \file
  11. /// \brief This file implements the ELF-specific dumper for llvm-readobj.
  12. ///
  13. //===----------------------------------------------------------------------===//
  14. #include "llvm-readobj.h"
  15. #include "ARMAttributeParser.h"
  16. #include "ARMEHABIPrinter.h"
  17. #include "Error.h"
  18. #include "ObjDumper.h"
  19. #include "StackMapPrinter.h"
  20. #include "StreamWriter.h"
  21. #include "llvm/ADT/Optional.h"
  22. #include "llvm/ADT/SmallString.h"
  23. #include "llvm/ADT/StringExtras.h"
  24. #include "llvm/Object/ELFObjectFile.h"
  25. #include "llvm/Support/ARMBuildAttributes.h"
  26. #include "llvm/Support/Compiler.h"
  27. #include "llvm/Support/Format.h"
  28. #include "llvm/Support/MathExtras.h"
  29. #include "llvm/Support/MipsABIFlags.h"
  30. #include "llvm/Support/raw_ostream.h"
  31. using namespace llvm;
  32. using namespace llvm::object;
  33. using namespace ELF;
  34. #define LLVM_READOBJ_ENUM_CASE(ns, enum) \
  35. case ns::enum: return #enum;
  36. namespace {
  37. template<typename ELFT>
  38. class ELFDumper : public ObjDumper {
  39. public:
  40. ELFDumper(const ELFFile<ELFT> *Obj, StreamWriter &Writer)
  41. : ObjDumper(Writer), Obj(Obj) {}
  42. void printFileHeaders() override;
  43. void printSections() override;
  44. void printRelocations() override;
  45. void printDynamicRelocations() override;
  46. void printSymbols() override;
  47. void printDynamicSymbols() override;
  48. void printUnwindInfo() override;
  49. void printDynamicTable() override;
  50. void printNeededLibraries() override;
  51. void printProgramHeaders() override;
  52. void printHashTable() override;
  53. void printAttributes() override;
  54. void printMipsPLTGOT() override;
  55. void printMipsABIFlags() override;
  56. void printMipsReginfo() override;
  57. void printStackMap() const override;
  58. private:
  59. typedef ELFFile<ELFT> ELFO;
  60. typedef typename ELFO::Elf_Shdr Elf_Shdr;
  61. typedef typename ELFO::Elf_Sym Elf_Sym;
  62. void printSymbol(const Elf_Sym *Symbol, bool IsDynamic);
  63. void printRelocations(const Elf_Shdr *Sec);
  64. void printRelocation(const Elf_Shdr *Sec, typename ELFO::Elf_Rela Rel);
  65. const ELFO *Obj;
  66. };
  67. template <class T> T errorOrDefault(ErrorOr<T> Val, T Default = T()) {
  68. if (!Val) {
  69. error(Val.getError());
  70. return Default;
  71. }
  72. return *Val;
  73. }
  74. } // namespace
  75. namespace llvm {
  76. template <class ELFT>
  77. static std::error_code createELFDumper(const ELFFile<ELFT> *Obj,
  78. StreamWriter &Writer,
  79. std::unique_ptr<ObjDumper> &Result) {
  80. Result.reset(new ELFDumper<ELFT>(Obj, Writer));
  81. return readobj_error::success;
  82. }
  83. std::error_code createELFDumper(const object::ObjectFile *Obj,
  84. StreamWriter &Writer,
  85. std::unique_ptr<ObjDumper> &Result) {
  86. // Little-endian 32-bit
  87. if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj))
  88. return createELFDumper(ELFObj->getELFFile(), Writer, Result);
  89. // Big-endian 32-bit
  90. if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj))
  91. return createELFDumper(ELFObj->getELFFile(), Writer, Result);
  92. // Little-endian 64-bit
  93. if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj))
  94. return createELFDumper(ELFObj->getELFFile(), Writer, Result);
  95. // Big-endian 64-bit
  96. if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj))
  97. return createELFDumper(ELFObj->getELFFile(), Writer, Result);
  98. return readobj_error::unsupported_obj_file_format;
  99. }
  100. } // namespace llvm
  101. template <typename ELFO>
  102. static std::string getFullSymbolName(const ELFO &Obj,
  103. const typename ELFO::Elf_Sym *Symbol,
  104. bool IsDynamic) {
  105. StringRef SymbolName = errorOrDefault(Obj.getSymbolName(Symbol, IsDynamic));
  106. if (!IsDynamic)
  107. return SymbolName;
  108. std::string FullSymbolName(SymbolName);
  109. bool IsDefault;
  110. ErrorOr<StringRef> Version =
  111. Obj.getSymbolVersion(nullptr, &*Symbol, IsDefault);
  112. if (Version) {
  113. FullSymbolName += (IsDefault ? "@@" : "@");
  114. FullSymbolName += *Version;
  115. } else
  116. error(Version.getError());
  117. return FullSymbolName;
  118. }
  119. template <typename ELFO>
  120. static void
  121. getSectionNameIndex(const ELFO &Obj, const typename ELFO::Elf_Sym *Symbol,
  122. StringRef &SectionName, unsigned &SectionIndex) {
  123. SectionIndex = Symbol->st_shndx;
  124. if (Symbol->isUndefined())
  125. SectionName = "Undefined";
  126. else if (Symbol->isProcessorSpecific())
  127. SectionName = "Processor Specific";
  128. else if (Symbol->isOSSpecific())
  129. SectionName = "Operating System Specific";
  130. else if (Symbol->isAbsolute())
  131. SectionName = "Absolute";
  132. else if (Symbol->isCommon())
  133. SectionName = "Common";
  134. else if (Symbol->isReserved() && SectionIndex != SHN_XINDEX)
  135. SectionName = "Reserved";
  136. else {
  137. if (SectionIndex == SHN_XINDEX)
  138. SectionIndex = Obj.getExtendedSymbolTableIndex(&*Symbol);
  139. ErrorOr<const typename ELFO::Elf_Shdr *> Sec = Obj.getSection(SectionIndex);
  140. if (!error(Sec.getError()))
  141. SectionName = errorOrDefault(Obj.getSectionName(*Sec));
  142. }
  143. }
  144. template <class ELFT>
  145. static const typename ELFFile<ELFT>::Elf_Shdr *
  146. findSectionByAddress(const ELFFile<ELFT> *Obj, uint64_t Addr) {
  147. for (const auto &Shdr : Obj->sections())
  148. if (Shdr.sh_addr == Addr)
  149. return &Shdr;
  150. return nullptr;
  151. }
  152. template <class ELFT>
  153. static const typename ELFFile<ELFT>::Elf_Shdr *
  154. findSectionByName(const ELFFile<ELFT> &Obj, StringRef Name) {
  155. for (const auto &Shdr : Obj.sections()) {
  156. if (Name == errorOrDefault(Obj.getSectionName(&Shdr)))
  157. return &Shdr;
  158. }
  159. return nullptr;
  160. }
  161. static const EnumEntry<unsigned> ElfClass[] = {
  162. { "None", ELF::ELFCLASSNONE },
  163. { "32-bit", ELF::ELFCLASS32 },
  164. { "64-bit", ELF::ELFCLASS64 },
  165. };
  166. static const EnumEntry<unsigned> ElfDataEncoding[] = {
  167. { "None", ELF::ELFDATANONE },
  168. { "LittleEndian", ELF::ELFDATA2LSB },
  169. { "BigEndian", ELF::ELFDATA2MSB },
  170. };
  171. static const EnumEntry<unsigned> ElfObjectFileType[] = {
  172. { "None", ELF::ET_NONE },
  173. { "Relocatable", ELF::ET_REL },
  174. { "Executable", ELF::ET_EXEC },
  175. { "SharedObject", ELF::ET_DYN },
  176. { "Core", ELF::ET_CORE },
  177. };
  178. static const EnumEntry<unsigned> ElfOSABI[] = {
  179. { "SystemV", ELF::ELFOSABI_NONE },
  180. { "HPUX", ELF::ELFOSABI_HPUX },
  181. { "NetBSD", ELF::ELFOSABI_NETBSD },
  182. { "GNU/Linux", ELF::ELFOSABI_LINUX },
  183. { "GNU/Hurd", ELF::ELFOSABI_HURD },
  184. { "Solaris", ELF::ELFOSABI_SOLARIS },
  185. { "AIX", ELF::ELFOSABI_AIX },
  186. { "IRIX", ELF::ELFOSABI_IRIX },
  187. { "FreeBSD", ELF::ELFOSABI_FREEBSD },
  188. { "TRU64", ELF::ELFOSABI_TRU64 },
  189. { "Modesto", ELF::ELFOSABI_MODESTO },
  190. { "OpenBSD", ELF::ELFOSABI_OPENBSD },
  191. { "OpenVMS", ELF::ELFOSABI_OPENVMS },
  192. { "NSK", ELF::ELFOSABI_NSK },
  193. { "AROS", ELF::ELFOSABI_AROS },
  194. { "FenixOS", ELF::ELFOSABI_FENIXOS },
  195. { "CloudABI", ELF::ELFOSABI_CLOUDABI },
  196. { "C6000_ELFABI", ELF::ELFOSABI_C6000_ELFABI },
  197. { "C6000_LINUX" , ELF::ELFOSABI_C6000_LINUX },
  198. { "ARM", ELF::ELFOSABI_ARM },
  199. { "Standalone" , ELF::ELFOSABI_STANDALONE }
  200. };
  201. static const EnumEntry<unsigned> ElfMachineType[] = {
  202. LLVM_READOBJ_ENUM_ENT(ELF, EM_NONE ),
  203. LLVM_READOBJ_ENUM_ENT(ELF, EM_M32 ),
  204. LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC ),
  205. LLVM_READOBJ_ENUM_ENT(ELF, EM_386 ),
  206. LLVM_READOBJ_ENUM_ENT(ELF, EM_68K ),
  207. LLVM_READOBJ_ENUM_ENT(ELF, EM_88K ),
  208. LLVM_READOBJ_ENUM_ENT(ELF, EM_IAMCU ),
  209. LLVM_READOBJ_ENUM_ENT(ELF, EM_860 ),
  210. LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS ),
  211. LLVM_READOBJ_ENUM_ENT(ELF, EM_S370 ),
  212. LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_RS3_LE ),
  213. LLVM_READOBJ_ENUM_ENT(ELF, EM_PARISC ),
  214. LLVM_READOBJ_ENUM_ENT(ELF, EM_VPP500 ),
  215. LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC32PLUS ),
  216. LLVM_READOBJ_ENUM_ENT(ELF, EM_960 ),
  217. LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC ),
  218. LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC64 ),
  219. LLVM_READOBJ_ENUM_ENT(ELF, EM_S390 ),
  220. LLVM_READOBJ_ENUM_ENT(ELF, EM_SPU ),
  221. LLVM_READOBJ_ENUM_ENT(ELF, EM_V800 ),
  222. LLVM_READOBJ_ENUM_ENT(ELF, EM_FR20 ),
  223. LLVM_READOBJ_ENUM_ENT(ELF, EM_RH32 ),
  224. LLVM_READOBJ_ENUM_ENT(ELF, EM_RCE ),
  225. LLVM_READOBJ_ENUM_ENT(ELF, EM_ARM ),
  226. LLVM_READOBJ_ENUM_ENT(ELF, EM_ALPHA ),
  227. LLVM_READOBJ_ENUM_ENT(ELF, EM_SH ),
  228. LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARCV9 ),
  229. LLVM_READOBJ_ENUM_ENT(ELF, EM_TRICORE ),
  230. LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC ),
  231. LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300 ),
  232. LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300H ),
  233. LLVM_READOBJ_ENUM_ENT(ELF, EM_H8S ),
  234. LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_500 ),
  235. LLVM_READOBJ_ENUM_ENT(ELF, EM_IA_64 ),
  236. LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_X ),
  237. LLVM_READOBJ_ENUM_ENT(ELF, EM_COLDFIRE ),
  238. LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC12 ),
  239. LLVM_READOBJ_ENUM_ENT(ELF, EM_MMA ),
  240. LLVM_READOBJ_ENUM_ENT(ELF, EM_PCP ),
  241. LLVM_READOBJ_ENUM_ENT(ELF, EM_NCPU ),
  242. LLVM_READOBJ_ENUM_ENT(ELF, EM_NDR1 ),
  243. LLVM_READOBJ_ENUM_ENT(ELF, EM_STARCORE ),
  244. LLVM_READOBJ_ENUM_ENT(ELF, EM_ME16 ),
  245. LLVM_READOBJ_ENUM_ENT(ELF, EM_ST100 ),
  246. LLVM_READOBJ_ENUM_ENT(ELF, EM_TINYJ ),
  247. LLVM_READOBJ_ENUM_ENT(ELF, EM_X86_64 ),
  248. LLVM_READOBJ_ENUM_ENT(ELF, EM_PDSP ),
  249. LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP10 ),
  250. LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP11 ),
  251. LLVM_READOBJ_ENUM_ENT(ELF, EM_FX66 ),
  252. LLVM_READOBJ_ENUM_ENT(ELF, EM_ST9PLUS ),
  253. LLVM_READOBJ_ENUM_ENT(ELF, EM_ST7 ),
  254. LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC16 ),
  255. LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC11 ),
  256. LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC08 ),
  257. LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC05 ),
  258. LLVM_READOBJ_ENUM_ENT(ELF, EM_SVX ),
  259. LLVM_READOBJ_ENUM_ENT(ELF, EM_ST19 ),
  260. LLVM_READOBJ_ENUM_ENT(ELF, EM_VAX ),
  261. LLVM_READOBJ_ENUM_ENT(ELF, EM_CRIS ),
  262. LLVM_READOBJ_ENUM_ENT(ELF, EM_JAVELIN ),
  263. LLVM_READOBJ_ENUM_ENT(ELF, EM_FIREPATH ),
  264. LLVM_READOBJ_ENUM_ENT(ELF, EM_ZSP ),
  265. LLVM_READOBJ_ENUM_ENT(ELF, EM_MMIX ),
  266. LLVM_READOBJ_ENUM_ENT(ELF, EM_HUANY ),
  267. LLVM_READOBJ_ENUM_ENT(ELF, EM_PRISM ),
  268. LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR ),
  269. LLVM_READOBJ_ENUM_ENT(ELF, EM_FR30 ),
  270. LLVM_READOBJ_ENUM_ENT(ELF, EM_D10V ),
  271. LLVM_READOBJ_ENUM_ENT(ELF, EM_D30V ),
  272. LLVM_READOBJ_ENUM_ENT(ELF, EM_V850 ),
  273. LLVM_READOBJ_ENUM_ENT(ELF, EM_M32R ),
  274. LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10300 ),
  275. LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10200 ),
  276. LLVM_READOBJ_ENUM_ENT(ELF, EM_PJ ),
  277. LLVM_READOBJ_ENUM_ENT(ELF, EM_OPENRISC ),
  278. LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT ),
  279. LLVM_READOBJ_ENUM_ENT(ELF, EM_XTENSA ),
  280. LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE ),
  281. LLVM_READOBJ_ENUM_ENT(ELF, EM_TMM_GPP ),
  282. LLVM_READOBJ_ENUM_ENT(ELF, EM_NS32K ),
  283. LLVM_READOBJ_ENUM_ENT(ELF, EM_TPC ),
  284. LLVM_READOBJ_ENUM_ENT(ELF, EM_SNP1K ),
  285. LLVM_READOBJ_ENUM_ENT(ELF, EM_ST200 ),
  286. LLVM_READOBJ_ENUM_ENT(ELF, EM_IP2K ),
  287. LLVM_READOBJ_ENUM_ENT(ELF, EM_MAX ),
  288. LLVM_READOBJ_ENUM_ENT(ELF, EM_CR ),
  289. LLVM_READOBJ_ENUM_ENT(ELF, EM_F2MC16 ),
  290. LLVM_READOBJ_ENUM_ENT(ELF, EM_MSP430 ),
  291. LLVM_READOBJ_ENUM_ENT(ELF, EM_BLACKFIN ),
  292. LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C33 ),
  293. LLVM_READOBJ_ENUM_ENT(ELF, EM_SEP ),
  294. LLVM_READOBJ_ENUM_ENT(ELF, EM_ARCA ),
  295. LLVM_READOBJ_ENUM_ENT(ELF, EM_UNICORE ),
  296. LLVM_READOBJ_ENUM_ENT(ELF, EM_EXCESS ),
  297. LLVM_READOBJ_ENUM_ENT(ELF, EM_DXP ),
  298. LLVM_READOBJ_ENUM_ENT(ELF, EM_ALTERA_NIOS2 ),
  299. LLVM_READOBJ_ENUM_ENT(ELF, EM_CRX ),
  300. LLVM_READOBJ_ENUM_ENT(ELF, EM_XGATE ),
  301. LLVM_READOBJ_ENUM_ENT(ELF, EM_C166 ),
  302. LLVM_READOBJ_ENUM_ENT(ELF, EM_M16C ),
  303. LLVM_READOBJ_ENUM_ENT(ELF, EM_DSPIC30F ),
  304. LLVM_READOBJ_ENUM_ENT(ELF, EM_CE ),
  305. LLVM_READOBJ_ENUM_ENT(ELF, EM_M32C ),
  306. LLVM_READOBJ_ENUM_ENT(ELF, EM_TSK3000 ),
  307. LLVM_READOBJ_ENUM_ENT(ELF, EM_RS08 ),
  308. LLVM_READOBJ_ENUM_ENT(ELF, EM_SHARC ),
  309. LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG2 ),
  310. LLVM_READOBJ_ENUM_ENT(ELF, EM_SCORE7 ),
  311. LLVM_READOBJ_ENUM_ENT(ELF, EM_DSP24 ),
  312. LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE3 ),
  313. LLVM_READOBJ_ENUM_ENT(ELF, EM_LATTICEMICO32),
  314. LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C17 ),
  315. LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C6000 ),
  316. LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C2000 ),
  317. LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C5500 ),
  318. LLVM_READOBJ_ENUM_ENT(ELF, EM_MMDSP_PLUS ),
  319. LLVM_READOBJ_ENUM_ENT(ELF, EM_CYPRESS_M8C ),
  320. LLVM_READOBJ_ENUM_ENT(ELF, EM_R32C ),
  321. LLVM_READOBJ_ENUM_ENT(ELF, EM_TRIMEDIA ),
  322. LLVM_READOBJ_ENUM_ENT(ELF, EM_HEXAGON ),
  323. LLVM_READOBJ_ENUM_ENT(ELF, EM_8051 ),
  324. LLVM_READOBJ_ENUM_ENT(ELF, EM_STXP7X ),
  325. LLVM_READOBJ_ENUM_ENT(ELF, EM_NDS32 ),
  326. LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1 ),
  327. LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1X ),
  328. LLVM_READOBJ_ENUM_ENT(ELF, EM_MAXQ30 ),
  329. LLVM_READOBJ_ENUM_ENT(ELF, EM_XIMO16 ),
  330. LLVM_READOBJ_ENUM_ENT(ELF, EM_MANIK ),
  331. LLVM_READOBJ_ENUM_ENT(ELF, EM_CRAYNV2 ),
  332. LLVM_READOBJ_ENUM_ENT(ELF, EM_RX ),
  333. LLVM_READOBJ_ENUM_ENT(ELF, EM_METAG ),
  334. LLVM_READOBJ_ENUM_ENT(ELF, EM_MCST_ELBRUS ),
  335. LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG16 ),
  336. LLVM_READOBJ_ENUM_ENT(ELF, EM_CR16 ),
  337. LLVM_READOBJ_ENUM_ENT(ELF, EM_ETPU ),
  338. LLVM_READOBJ_ENUM_ENT(ELF, EM_SLE9X ),
  339. LLVM_READOBJ_ENUM_ENT(ELF, EM_L10M ),
  340. LLVM_READOBJ_ENUM_ENT(ELF, EM_K10M ),
  341. LLVM_READOBJ_ENUM_ENT(ELF, EM_AARCH64 ),
  342. LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR32 ),
  343. LLVM_READOBJ_ENUM_ENT(ELF, EM_STM8 ),
  344. LLVM_READOBJ_ENUM_ENT(ELF, EM_TILE64 ),
  345. LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEPRO ),
  346. LLVM_READOBJ_ENUM_ENT(ELF, EM_CUDA ),
  347. LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEGX ),
  348. LLVM_READOBJ_ENUM_ENT(ELF, EM_CLOUDSHIELD ),
  349. LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_1ST ),
  350. LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_2ND ),
  351. LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT2 ),
  352. LLVM_READOBJ_ENUM_ENT(ELF, EM_OPEN8 ),
  353. LLVM_READOBJ_ENUM_ENT(ELF, EM_RL78 ),
  354. LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE5 ),
  355. LLVM_READOBJ_ENUM_ENT(ELF, EM_78KOR ),
  356. LLVM_READOBJ_ENUM_ENT(ELF, EM_56800EX ),
  357. LLVM_READOBJ_ENUM_ENT(ELF, EM_AMDGPU )
  358. };
  359. static const EnumEntry<unsigned> ElfSymbolBindings[] = {
  360. { "Local", ELF::STB_LOCAL },
  361. { "Global", ELF::STB_GLOBAL },
  362. { "Weak", ELF::STB_WEAK },
  363. { "Unique", ELF::STB_GNU_UNIQUE }
  364. };
  365. static const EnumEntry<unsigned> ElfSymbolTypes[] = {
  366. { "None", ELF::STT_NOTYPE },
  367. { "Object", ELF::STT_OBJECT },
  368. { "Function", ELF::STT_FUNC },
  369. { "Section", ELF::STT_SECTION },
  370. { "File", ELF::STT_FILE },
  371. { "Common", ELF::STT_COMMON },
  372. { "TLS", ELF::STT_TLS },
  373. { "GNU_IFunc", ELF::STT_GNU_IFUNC }
  374. };
  375. static const char *getElfSectionType(unsigned Arch, unsigned Type) {
  376. switch (Arch) {
  377. case ELF::EM_ARM:
  378. switch (Type) {
  379. LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_EXIDX);
  380. LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP);
  381. LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES);
  382. LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY);
  383. LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION);
  384. }
  385. case ELF::EM_HEXAGON:
  386. switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, SHT_HEX_ORDERED); }
  387. case ELF::EM_X86_64:
  388. switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, SHT_X86_64_UNWIND); }
  389. case ELF::EM_MIPS:
  390. case ELF::EM_MIPS_RS3_LE:
  391. switch (Type) {
  392. LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_REGINFO);
  393. LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_OPTIONS);
  394. LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_ABIFLAGS);
  395. }
  396. }
  397. switch (Type) {
  398. LLVM_READOBJ_ENUM_CASE(ELF, SHT_NULL );
  399. LLVM_READOBJ_ENUM_CASE(ELF, SHT_PROGBITS );
  400. LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB );
  401. LLVM_READOBJ_ENUM_CASE(ELF, SHT_STRTAB );
  402. LLVM_READOBJ_ENUM_CASE(ELF, SHT_RELA );
  403. LLVM_READOBJ_ENUM_CASE(ELF, SHT_HASH );
  404. LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNAMIC );
  405. LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOTE );
  406. LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOBITS );
  407. LLVM_READOBJ_ENUM_CASE(ELF, SHT_REL );
  408. LLVM_READOBJ_ENUM_CASE(ELF, SHT_SHLIB );
  409. LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNSYM );
  410. LLVM_READOBJ_ENUM_CASE(ELF, SHT_INIT_ARRAY );
  411. LLVM_READOBJ_ENUM_CASE(ELF, SHT_FINI_ARRAY );
  412. LLVM_READOBJ_ENUM_CASE(ELF, SHT_PREINIT_ARRAY );
  413. LLVM_READOBJ_ENUM_CASE(ELF, SHT_GROUP );
  414. LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX );
  415. LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES );
  416. LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_HASH );
  417. LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verdef );
  418. LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verneed );
  419. LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_versym );
  420. default: return "";
  421. }
  422. }
  423. static const EnumEntry<unsigned> ElfSectionFlags[] = {
  424. LLVM_READOBJ_ENUM_ENT(ELF, SHF_WRITE ),
  425. LLVM_READOBJ_ENUM_ENT(ELF, SHF_ALLOC ),
  426. LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXCLUDE ),
  427. LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXECINSTR ),
  428. LLVM_READOBJ_ENUM_ENT(ELF, SHF_MERGE ),
  429. LLVM_READOBJ_ENUM_ENT(ELF, SHF_STRINGS ),
  430. LLVM_READOBJ_ENUM_ENT(ELF, SHF_INFO_LINK ),
  431. LLVM_READOBJ_ENUM_ENT(ELF, SHF_LINK_ORDER ),
  432. LLVM_READOBJ_ENUM_ENT(ELF, SHF_OS_NONCONFORMING),
  433. LLVM_READOBJ_ENUM_ENT(ELF, SHF_GROUP ),
  434. LLVM_READOBJ_ENUM_ENT(ELF, SHF_TLS ),
  435. LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION),
  436. LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION),
  437. LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP )
  438. };
  439. static const char *getElfSegmentType(unsigned Arch, unsigned Type) {
  440. // Check potentially overlapped processor-specific
  441. // program header type.
  442. switch (Arch) {
  443. case ELF::EM_ARM:
  444. switch (Type) {
  445. LLVM_READOBJ_ENUM_CASE(ELF, PT_ARM_EXIDX);
  446. }
  447. case ELF::EM_MIPS:
  448. case ELF::EM_MIPS_RS3_LE:
  449. switch (Type) {
  450. LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_REGINFO);
  451. LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_RTPROC);
  452. LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_OPTIONS);
  453. LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_ABIFLAGS);
  454. }
  455. }
  456. switch (Type) {
  457. LLVM_READOBJ_ENUM_CASE(ELF, PT_NULL );
  458. LLVM_READOBJ_ENUM_CASE(ELF, PT_LOAD );
  459. LLVM_READOBJ_ENUM_CASE(ELF, PT_DYNAMIC);
  460. LLVM_READOBJ_ENUM_CASE(ELF, PT_INTERP );
  461. LLVM_READOBJ_ENUM_CASE(ELF, PT_NOTE );
  462. LLVM_READOBJ_ENUM_CASE(ELF, PT_SHLIB );
  463. LLVM_READOBJ_ENUM_CASE(ELF, PT_PHDR );
  464. LLVM_READOBJ_ENUM_CASE(ELF, PT_TLS );
  465. LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_EH_FRAME);
  466. LLVM_READOBJ_ENUM_CASE(ELF, PT_SUNW_UNWIND);
  467. LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_STACK);
  468. LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_RELRO);
  469. default: return "";
  470. }
  471. }
  472. static const EnumEntry<unsigned> ElfSegmentFlags[] = {
  473. LLVM_READOBJ_ENUM_ENT(ELF, PF_X),
  474. LLVM_READOBJ_ENUM_ENT(ELF, PF_W),
  475. LLVM_READOBJ_ENUM_ENT(ELF, PF_R)
  476. };
  477. static const EnumEntry<unsigned> ElfHeaderMipsFlags[] = {
  478. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_NOREORDER),
  479. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_PIC),
  480. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_CPIC),
  481. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI2),
  482. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_32BITMODE),
  483. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_FP64),
  484. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_NAN2008),
  485. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_O32),
  486. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_O64),
  487. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_EABI32),
  488. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_EABI64),
  489. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_3900),
  490. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4010),
  491. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4100),
  492. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4650),
  493. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4120),
  494. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_4111),
  495. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_SB1),
  496. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_OCTEON),
  497. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_XLR),
  498. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_OCTEON2),
  499. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_OCTEON3),
  500. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_5400),
  501. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_5900),
  502. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_5500),
  503. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_9000),
  504. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_LS2E),
  505. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_LS2F),
  506. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MACH_LS3A),
  507. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MICROMIPS),
  508. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_ASE_M16),
  509. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_ASE_MDMX),
  510. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_1),
  511. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_2),
  512. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_3),
  513. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_4),
  514. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_5),
  515. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32),
  516. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64),
  517. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32R2),
  518. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64R2),
  519. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32R6),
  520. LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64R6)
  521. };
  522. template<class ELFT>
  523. void ELFDumper<ELFT>::printFileHeaders() {
  524. const typename ELFO::Elf_Ehdr *Header = Obj->getHeader();
  525. {
  526. DictScope D(W, "ElfHeader");
  527. {
  528. DictScope D(W, "Ident");
  529. W.printBinary("Magic", makeArrayRef(Header->e_ident).slice(ELF::EI_MAG0,
  530. 4));
  531. W.printEnum ("Class", Header->e_ident[ELF::EI_CLASS],
  532. makeArrayRef(ElfClass));
  533. W.printEnum ("DataEncoding", Header->e_ident[ELF::EI_DATA],
  534. makeArrayRef(ElfDataEncoding));
  535. W.printNumber("FileVersion", Header->e_ident[ELF::EI_VERSION]);
  536. // Handle architecture specific OS/ABI values.
  537. if (Header->e_machine == ELF::EM_AMDGPU &&
  538. Header->e_ident[ELF::EI_OSABI] == ELF::ELFOSABI_AMDGPU_HSA)
  539. W.printHex("OS/ABI", "AMDGPU_HSA", ELF::ELFOSABI_AMDGPU_HSA);
  540. else
  541. W.printEnum ("OS/ABI", Header->e_ident[ELF::EI_OSABI],
  542. makeArrayRef(ElfOSABI));
  543. W.printNumber("ABIVersion", Header->e_ident[ELF::EI_ABIVERSION]);
  544. W.printBinary("Unused", makeArrayRef(Header->e_ident).slice(ELF::EI_PAD));
  545. }
  546. W.printEnum ("Type", Header->e_type, makeArrayRef(ElfObjectFileType));
  547. W.printEnum ("Machine", Header->e_machine, makeArrayRef(ElfMachineType));
  548. W.printNumber("Version", Header->e_version);
  549. W.printHex ("Entry", Header->e_entry);
  550. W.printHex ("ProgramHeaderOffset", Header->e_phoff);
  551. W.printHex ("SectionHeaderOffset", Header->e_shoff);
  552. if (Header->e_machine == EM_MIPS)
  553. W.printFlags("Flags", Header->e_flags, makeArrayRef(ElfHeaderMipsFlags),
  554. unsigned(ELF::EF_MIPS_ARCH), unsigned(ELF::EF_MIPS_ABI),
  555. unsigned(ELF::EF_MIPS_MACH));
  556. else
  557. W.printFlags("Flags", Header->e_flags);
  558. W.printNumber("HeaderSize", Header->e_ehsize);
  559. W.printNumber("ProgramHeaderEntrySize", Header->e_phentsize);
  560. W.printNumber("ProgramHeaderCount", Header->e_phnum);
  561. W.printNumber("SectionHeaderEntrySize", Header->e_shentsize);
  562. W.printNumber("SectionHeaderCount", Header->e_shnum);
  563. W.printNumber("StringTableSectionIndex", Header->e_shstrndx);
  564. }
  565. }
  566. template<class ELFT>
  567. void ELFDumper<ELFT>::printSections() {
  568. ListScope SectionsD(W, "Sections");
  569. int SectionIndex = -1;
  570. for (const typename ELFO::Elf_Shdr &Sec : Obj->sections()) {
  571. ++SectionIndex;
  572. StringRef Name = errorOrDefault(Obj->getSectionName(&Sec));
  573. DictScope SectionD(W, "Section");
  574. W.printNumber("Index", SectionIndex);
  575. W.printNumber("Name", Name, Sec.sh_name);
  576. W.printHex("Type",
  577. getElfSectionType(Obj->getHeader()->e_machine, Sec.sh_type),
  578. Sec.sh_type);
  579. W.printFlags("Flags", Sec.sh_flags, makeArrayRef(ElfSectionFlags));
  580. W.printHex("Address", Sec.sh_addr);
  581. W.printHex("Offset", Sec.sh_offset);
  582. W.printNumber("Size", Sec.sh_size);
  583. W.printNumber("Link", Sec.sh_link);
  584. W.printNumber("Info", Sec.sh_info);
  585. W.printNumber("AddressAlignment", Sec.sh_addralign);
  586. W.printNumber("EntrySize", Sec.sh_entsize);
  587. if (opts::SectionRelocations) {
  588. ListScope D(W, "Relocations");
  589. printRelocations(&Sec);
  590. }
  591. if (opts::SectionSymbols) {
  592. ListScope D(W, "Symbols");
  593. for (const typename ELFO::Elf_Sym &Sym : Obj->symbols()) {
  594. ErrorOr<const Elf_Shdr *> SymSec = Obj->getSection(&Sym);
  595. if (!SymSec)
  596. continue;
  597. if (*SymSec == &Sec)
  598. printSymbol(&Sym, false);
  599. }
  600. }
  601. if (opts::SectionData && Sec.sh_type != ELF::SHT_NOBITS) {
  602. ArrayRef<uint8_t> Data = errorOrDefault(Obj->getSectionContents(&Sec));
  603. W.printBinaryBlock("SectionData",
  604. StringRef((const char *)Data.data(), Data.size()));
  605. }
  606. }
  607. }
  608. template<class ELFT>
  609. void ELFDumper<ELFT>::printRelocations() {
  610. ListScope D(W, "Relocations");
  611. int SectionNumber = -1;
  612. for (const typename ELFO::Elf_Shdr &Sec : Obj->sections()) {
  613. ++SectionNumber;
  614. if (Sec.sh_type != ELF::SHT_REL && Sec.sh_type != ELF::SHT_RELA)
  615. continue;
  616. StringRef Name = errorOrDefault(Obj->getSectionName(&Sec));
  617. W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n";
  618. W.indent();
  619. printRelocations(&Sec);
  620. W.unindent();
  621. W.startLine() << "}\n";
  622. }
  623. }
  624. template<class ELFT>
  625. void ELFDumper<ELFT>::printDynamicRelocations() {
  626. W.startLine() << "Dynamic Relocations {\n";
  627. W.indent();
  628. for (typename ELFO::Elf_Rela_Iter RelI = Obj->dyn_rela_begin(),
  629. RelE = Obj->dyn_rela_end();
  630. RelI != RelE; ++RelI) {
  631. SmallString<32> RelocName;
  632. Obj->getRelocationTypeName(RelI->getType(Obj->isMips64EL()), RelocName);
  633. StringRef SymbolName;
  634. uint32_t SymIndex = RelI->getSymbol(Obj->isMips64EL());
  635. const typename ELFO::Elf_Sym *Sym = Obj->dynamic_symbol_begin() + SymIndex;
  636. SymbolName = errorOrDefault(Obj->getSymbolName(Sym, true));
  637. if (opts::ExpandRelocs) {
  638. DictScope Group(W, "Relocation");
  639. W.printHex("Offset", RelI->r_offset);
  640. W.printNumber("Type", RelocName, (int)RelI->getType(Obj->isMips64EL()));
  641. W.printString("Symbol", SymbolName.size() > 0 ? SymbolName : "-");
  642. W.printHex("Addend", RelI->r_addend);
  643. }
  644. else {
  645. raw_ostream& OS = W.startLine();
  646. OS << W.hex(RelI->r_offset)
  647. << " " << RelocName
  648. << " " << (SymbolName.size() > 0 ? SymbolName : "-")
  649. << " " << W.hex(RelI->r_addend)
  650. << "\n";
  651. }
  652. }
  653. W.unindent();
  654. W.startLine() << "}\n";
  655. }
  656. template <class ELFT>
  657. void ELFDumper<ELFT>::printRelocations(const Elf_Shdr *Sec) {
  658. switch (Sec->sh_type) {
  659. case ELF::SHT_REL:
  660. for (typename ELFO::Elf_Rel_Iter RI = Obj->rel_begin(Sec),
  661. RE = Obj->rel_end(Sec);
  662. RI != RE; ++RI) {
  663. typename ELFO::Elf_Rela Rela;
  664. Rela.r_offset = RI->r_offset;
  665. Rela.r_info = RI->r_info;
  666. Rela.r_addend = 0;
  667. printRelocation(Sec, Rela);
  668. }
  669. break;
  670. case ELF::SHT_RELA:
  671. for (typename ELFO::Elf_Rela_Iter RI = Obj->rela_begin(Sec),
  672. RE = Obj->rela_end(Sec);
  673. RI != RE; ++RI) {
  674. printRelocation(Sec, *RI);
  675. }
  676. break;
  677. }
  678. }
  679. template <class ELFT>
  680. void ELFDumper<ELFT>::printRelocation(const Elf_Shdr *Sec,
  681. typename ELFO::Elf_Rela Rel) {
  682. SmallString<32> RelocName;
  683. Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName);
  684. StringRef TargetName;
  685. std::pair<const Elf_Shdr *, const Elf_Sym *> Sym =
  686. Obj->getRelocationSymbol(Sec, &Rel);
  687. if (Sym.second && Sym.second->getType() == ELF::STT_SECTION) {
  688. ErrorOr<const Elf_Shdr *> Sec = Obj->getSection(Sym.second);
  689. if (!error(Sec.getError())) {
  690. ErrorOr<StringRef> SecName = Obj->getSectionName(*Sec);
  691. if (SecName)
  692. TargetName = SecName.get();
  693. }
  694. } else if (Sym.first) {
  695. const Elf_Shdr *SymTable = Sym.first;
  696. ErrorOr<const Elf_Shdr *> StrTableSec = Obj->getSection(SymTable->sh_link);
  697. if (!error(StrTableSec.getError())) {
  698. ErrorOr<StringRef> StrTableOrErr = Obj->getStringTable(*StrTableSec);
  699. if (!error(StrTableOrErr.getError()))
  700. TargetName = errorOrDefault(Sym.second->getName(*StrTableOrErr));
  701. }
  702. }
  703. if (opts::ExpandRelocs) {
  704. DictScope Group(W, "Relocation");
  705. W.printHex("Offset", Rel.r_offset);
  706. W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL()));
  707. W.printNumber("Symbol", TargetName.size() > 0 ? TargetName : "-",
  708. Rel.getSymbol(Obj->isMips64EL()));
  709. W.printHex("Addend", Rel.r_addend);
  710. } else {
  711. raw_ostream& OS = W.startLine();
  712. OS << W.hex(Rel.r_offset) << " " << RelocName << " "
  713. << (TargetName.size() > 0 ? TargetName : "-") << " "
  714. << W.hex(Rel.r_addend) << "\n";
  715. }
  716. }
  717. template<class ELFT>
  718. void ELFDumper<ELFT>::printSymbols() {
  719. ListScope Group(W, "Symbols");
  720. for (const typename ELFO::Elf_Sym &Sym : Obj->symbols())
  721. printSymbol(&Sym, false);
  722. }
  723. template<class ELFT>
  724. void ELFDumper<ELFT>::printDynamicSymbols() {
  725. ListScope Group(W, "DynamicSymbols");
  726. for (const typename ELFO::Elf_Sym &Sym : Obj->dynamic_symbols())
  727. printSymbol(&Sym, true);
  728. }
  729. template <class ELFT>
  730. void ELFDumper<ELFT>::printSymbol(const typename ELFO::Elf_Sym *Symbol,
  731. bool IsDynamic) {
  732. unsigned SectionIndex = 0;
  733. StringRef SectionName;
  734. getSectionNameIndex(*Obj, Symbol, SectionName, SectionIndex);
  735. std::string FullSymbolName = getFullSymbolName(*Obj, Symbol, IsDynamic);
  736. DictScope D(W, "Symbol");
  737. W.printNumber("Name", FullSymbolName, Symbol->st_name);
  738. W.printHex ("Value", Symbol->st_value);
  739. W.printNumber("Size", Symbol->st_size);
  740. W.printEnum ("Binding", Symbol->getBinding(),
  741. makeArrayRef(ElfSymbolBindings));
  742. W.printEnum ("Type", Symbol->getType(), makeArrayRef(ElfSymbolTypes));
  743. W.printNumber("Other", Symbol->st_other);
  744. W.printHex("Section", SectionName, SectionIndex);
  745. }
  746. #define LLVM_READOBJ_TYPE_CASE(name) \
  747. case DT_##name: return #name
  748. static const char *getTypeString(uint64_t Type) {
  749. switch (Type) {
  750. LLVM_READOBJ_TYPE_CASE(BIND_NOW);
  751. LLVM_READOBJ_TYPE_CASE(DEBUG);
  752. LLVM_READOBJ_TYPE_CASE(FINI);
  753. LLVM_READOBJ_TYPE_CASE(FINI_ARRAY);
  754. LLVM_READOBJ_TYPE_CASE(FINI_ARRAYSZ);
  755. LLVM_READOBJ_TYPE_CASE(FLAGS);
  756. LLVM_READOBJ_TYPE_CASE(FLAGS_1);
  757. LLVM_READOBJ_TYPE_CASE(HASH);
  758. LLVM_READOBJ_TYPE_CASE(INIT);
  759. LLVM_READOBJ_TYPE_CASE(INIT_ARRAY);
  760. LLVM_READOBJ_TYPE_CASE(INIT_ARRAYSZ);
  761. LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAY);
  762. LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAYSZ);
  763. LLVM_READOBJ_TYPE_CASE(JMPREL);
  764. LLVM_READOBJ_TYPE_CASE(NEEDED);
  765. LLVM_READOBJ_TYPE_CASE(NULL);
  766. LLVM_READOBJ_TYPE_CASE(PLTGOT);
  767. LLVM_READOBJ_TYPE_CASE(PLTREL);
  768. LLVM_READOBJ_TYPE_CASE(PLTRELSZ);
  769. LLVM_READOBJ_TYPE_CASE(REL);
  770. LLVM_READOBJ_TYPE_CASE(RELA);
  771. LLVM_READOBJ_TYPE_CASE(RELENT);
  772. LLVM_READOBJ_TYPE_CASE(RELSZ);
  773. LLVM_READOBJ_TYPE_CASE(RELAENT);
  774. LLVM_READOBJ_TYPE_CASE(RELASZ);
  775. LLVM_READOBJ_TYPE_CASE(RPATH);
  776. LLVM_READOBJ_TYPE_CASE(RUNPATH);
  777. LLVM_READOBJ_TYPE_CASE(SONAME);
  778. LLVM_READOBJ_TYPE_CASE(STRSZ);
  779. LLVM_READOBJ_TYPE_CASE(STRTAB);
  780. LLVM_READOBJ_TYPE_CASE(SYMBOLIC);
  781. LLVM_READOBJ_TYPE_CASE(SYMENT);
  782. LLVM_READOBJ_TYPE_CASE(SYMTAB);
  783. LLVM_READOBJ_TYPE_CASE(TEXTREL);
  784. LLVM_READOBJ_TYPE_CASE(VERNEED);
  785. LLVM_READOBJ_TYPE_CASE(VERNEEDNUM);
  786. LLVM_READOBJ_TYPE_CASE(VERSYM);
  787. LLVM_READOBJ_TYPE_CASE(RELCOUNT);
  788. LLVM_READOBJ_TYPE_CASE(GNU_HASH);
  789. LLVM_READOBJ_TYPE_CASE(MIPS_RLD_VERSION);
  790. LLVM_READOBJ_TYPE_CASE(MIPS_FLAGS);
  791. LLVM_READOBJ_TYPE_CASE(MIPS_BASE_ADDRESS);
  792. LLVM_READOBJ_TYPE_CASE(MIPS_LOCAL_GOTNO);
  793. LLVM_READOBJ_TYPE_CASE(MIPS_SYMTABNO);
  794. LLVM_READOBJ_TYPE_CASE(MIPS_UNREFEXTNO);
  795. LLVM_READOBJ_TYPE_CASE(MIPS_GOTSYM);
  796. LLVM_READOBJ_TYPE_CASE(MIPS_RLD_MAP);
  797. LLVM_READOBJ_TYPE_CASE(MIPS_PLTGOT);
  798. LLVM_READOBJ_TYPE_CASE(MIPS_OPTIONS);
  799. default: return "unknown";
  800. }
  801. }
  802. #undef LLVM_READOBJ_TYPE_CASE
  803. #define LLVM_READOBJ_DT_FLAG_ENT(prefix, enum) \
  804. { #enum, prefix##_##enum }
  805. static const EnumEntry<unsigned> ElfDynamicDTFlags[] = {
  806. LLVM_READOBJ_DT_FLAG_ENT(DF, ORIGIN),
  807. LLVM_READOBJ_DT_FLAG_ENT(DF, SYMBOLIC),
  808. LLVM_READOBJ_DT_FLAG_ENT(DF, TEXTREL),
  809. LLVM_READOBJ_DT_FLAG_ENT(DF, BIND_NOW),
  810. LLVM_READOBJ_DT_FLAG_ENT(DF, STATIC_TLS)
  811. };
  812. static const EnumEntry<unsigned> ElfDynamicDTFlags1[] = {
  813. LLVM_READOBJ_DT_FLAG_ENT(DF_1, NOW),
  814. LLVM_READOBJ_DT_FLAG_ENT(DF_1, GLOBAL),
  815. LLVM_READOBJ_DT_FLAG_ENT(DF_1, GROUP),
  816. LLVM_READOBJ_DT_FLAG_ENT(DF_1, NODELETE),
  817. LLVM_READOBJ_DT_FLAG_ENT(DF_1, LOADFLTR),
  818. LLVM_READOBJ_DT_FLAG_ENT(DF_1, INITFIRST),
  819. LLVM_READOBJ_DT_FLAG_ENT(DF_1, NOOPEN),
  820. LLVM_READOBJ_DT_FLAG_ENT(DF_1, ORIGIN),
  821. LLVM_READOBJ_DT_FLAG_ENT(DF_1, DIRECT),
  822. LLVM_READOBJ_DT_FLAG_ENT(DF_1, TRANS),
  823. LLVM_READOBJ_DT_FLAG_ENT(DF_1, INTERPOSE),
  824. LLVM_READOBJ_DT_FLAG_ENT(DF_1, NODEFLIB),
  825. LLVM_READOBJ_DT_FLAG_ENT(DF_1, NODUMP),
  826. LLVM_READOBJ_DT_FLAG_ENT(DF_1, CONFALT),
  827. LLVM_READOBJ_DT_FLAG_ENT(DF_1, ENDFILTEE),
  828. LLVM_READOBJ_DT_FLAG_ENT(DF_1, DISPRELDNE),
  829. LLVM_READOBJ_DT_FLAG_ENT(DF_1, NODIRECT),
  830. LLVM_READOBJ_DT_FLAG_ENT(DF_1, IGNMULDEF),
  831. LLVM_READOBJ_DT_FLAG_ENT(DF_1, NOKSYMS),
  832. LLVM_READOBJ_DT_FLAG_ENT(DF_1, NOHDR),
  833. LLVM_READOBJ_DT_FLAG_ENT(DF_1, EDITED),
  834. LLVM_READOBJ_DT_FLAG_ENT(DF_1, NORELOC),
  835. LLVM_READOBJ_DT_FLAG_ENT(DF_1, SYMINTPOSE),
  836. LLVM_READOBJ_DT_FLAG_ENT(DF_1, GLOBAUDIT),
  837. LLVM_READOBJ_DT_FLAG_ENT(DF_1, SINGLETON)
  838. };
  839. static const EnumEntry<unsigned> ElfDynamicDTMipsFlags[] = {
  840. LLVM_READOBJ_DT_FLAG_ENT(RHF, NONE),
  841. LLVM_READOBJ_DT_FLAG_ENT(RHF, QUICKSTART),
  842. LLVM_READOBJ_DT_FLAG_ENT(RHF, NOTPOT),
  843. LLVM_READOBJ_DT_FLAG_ENT(RHS, NO_LIBRARY_REPLACEMENT),
  844. LLVM_READOBJ_DT_FLAG_ENT(RHF, NO_MOVE),
  845. LLVM_READOBJ_DT_FLAG_ENT(RHF, SGI_ONLY),
  846. LLVM_READOBJ_DT_FLAG_ENT(RHF, GUARANTEE_INIT),
  847. LLVM_READOBJ_DT_FLAG_ENT(RHF, DELTA_C_PLUS_PLUS),
  848. LLVM_READOBJ_DT_FLAG_ENT(RHF, GUARANTEE_START_INIT),
  849. LLVM_READOBJ_DT_FLAG_ENT(RHF, PIXIE),
  850. LLVM_READOBJ_DT_FLAG_ENT(RHF, DEFAULT_DELAY_LOAD),
  851. LLVM_READOBJ_DT_FLAG_ENT(RHF, REQUICKSTART),
  852. LLVM_READOBJ_DT_FLAG_ENT(RHF, REQUICKSTARTED),
  853. LLVM_READOBJ_DT_FLAG_ENT(RHF, CORD),
  854. LLVM_READOBJ_DT_FLAG_ENT(RHF, NO_UNRES_UNDEF),
  855. LLVM_READOBJ_DT_FLAG_ENT(RHF, RLD_ORDER_SAFE)
  856. };
  857. #undef LLVM_READOBJ_DT_FLAG_ENT
  858. template <typename T, typename TFlag>
  859. void printFlags(T Value, ArrayRef<EnumEntry<TFlag>> Flags, raw_ostream &OS) {
  860. typedef EnumEntry<TFlag> FlagEntry;
  861. typedef SmallVector<FlagEntry, 10> FlagVector;
  862. FlagVector SetFlags;
  863. for (const auto &Flag : Flags) {
  864. if (Flag.Value == 0)
  865. continue;
  866. if ((Value & Flag.Value) == Flag.Value)
  867. SetFlags.push_back(Flag);
  868. }
  869. for (const auto &Flag : SetFlags) {
  870. OS << Flag.Name << " ";
  871. }
  872. }
  873. template <class ELFT>
  874. static void printValue(const ELFFile<ELFT> *O, uint64_t Type, uint64_t Value,
  875. bool Is64, raw_ostream &OS) {
  876. switch (Type) {
  877. case DT_PLTREL:
  878. if (Value == DT_REL) {
  879. OS << "REL";
  880. break;
  881. } else if (Value == DT_RELA) {
  882. OS << "RELA";
  883. break;
  884. }
  885. // Fallthrough.
  886. case DT_PLTGOT:
  887. case DT_HASH:
  888. case DT_STRTAB:
  889. case DT_SYMTAB:
  890. case DT_RELA:
  891. case DT_INIT:
  892. case DT_FINI:
  893. case DT_REL:
  894. case DT_JMPREL:
  895. case DT_INIT_ARRAY:
  896. case DT_FINI_ARRAY:
  897. case DT_PREINIT_ARRAY:
  898. case DT_DEBUG:
  899. case DT_VERNEED:
  900. case DT_VERSYM:
  901. case DT_GNU_HASH:
  902. case DT_NULL:
  903. case DT_MIPS_BASE_ADDRESS:
  904. case DT_MIPS_GOTSYM:
  905. case DT_MIPS_RLD_MAP:
  906. case DT_MIPS_PLTGOT:
  907. case DT_MIPS_OPTIONS:
  908. OS << format("0x%" PRIX64, Value);
  909. break;
  910. case DT_RELCOUNT:
  911. case DT_VERNEEDNUM:
  912. case DT_MIPS_RLD_VERSION:
  913. case DT_MIPS_LOCAL_GOTNO:
  914. case DT_MIPS_SYMTABNO:
  915. case DT_MIPS_UNREFEXTNO:
  916. OS << Value;
  917. break;
  918. case DT_PLTRELSZ:
  919. case DT_RELASZ:
  920. case DT_RELAENT:
  921. case DT_STRSZ:
  922. case DT_SYMENT:
  923. case DT_RELSZ:
  924. case DT_RELENT:
  925. case DT_INIT_ARRAYSZ:
  926. case DT_FINI_ARRAYSZ:
  927. case DT_PREINIT_ARRAYSZ:
  928. OS << Value << " (bytes)";
  929. break;
  930. case DT_NEEDED:
  931. OS << "SharedLibrary (" << O->getDynamicString(Value) << ")";
  932. break;
  933. case DT_SONAME:
  934. OS << "LibrarySoname (" << O->getDynamicString(Value) << ")";
  935. break;
  936. case DT_RPATH:
  937. case DT_RUNPATH:
  938. OS << O->getDynamicString(Value);
  939. break;
  940. case DT_MIPS_FLAGS:
  941. printFlags(Value, makeArrayRef(ElfDynamicDTMipsFlags), OS);
  942. break;
  943. case DT_FLAGS:
  944. printFlags(Value, makeArrayRef(ElfDynamicDTFlags), OS);
  945. break;
  946. case DT_FLAGS_1:
  947. printFlags(Value, makeArrayRef(ElfDynamicDTFlags1), OS);
  948. break;
  949. default:
  950. OS << format("0x%" PRIX64, Value);
  951. break;
  952. }
  953. }
  954. template<class ELFT>
  955. void ELFDumper<ELFT>::printUnwindInfo() {
  956. W.startLine() << "UnwindInfo not implemented.\n";
  957. }
  958. namespace {
  959. template <> void ELFDumper<ELFType<support::little, false>>::printUnwindInfo() {
  960. const unsigned Machine = Obj->getHeader()->e_machine;
  961. if (Machine == EM_ARM) {
  962. ARM::EHABI::PrinterContext<ELFType<support::little, false>> Ctx(W, Obj);
  963. return Ctx.PrintUnwindInformation();
  964. }
  965. W.startLine() << "UnwindInfo not implemented.\n";
  966. }
  967. }
  968. template<class ELFT>
  969. void ELFDumper<ELFT>::printDynamicTable() {
  970. auto DynTable = Obj->dynamic_table(true);
  971. ptrdiff_t Total = std::distance(DynTable.begin(), DynTable.end());
  972. if (Total == 0)
  973. return;
  974. raw_ostream &OS = W.getOStream();
  975. W.startLine() << "DynamicSection [ (" << Total << " entries)\n";
  976. bool Is64 = ELFT::Is64Bits;
  977. W.startLine()
  978. << " Tag" << (Is64 ? " " : " ") << "Type"
  979. << " " << "Name/Value\n";
  980. for (const auto &Entry : DynTable) {
  981. W.startLine()
  982. << " "
  983. << format(Is64 ? "0x%016" PRIX64 : "0x%08" PRIX64, Entry.getTag())
  984. << " " << format("%-21s", getTypeString(Entry.getTag()));
  985. printValue(Obj, Entry.getTag(), Entry.getVal(), Is64, OS);
  986. OS << "\n";
  987. }
  988. W.startLine() << "]\n";
  989. }
  990. template<class ELFT>
  991. void ELFDumper<ELFT>::printNeededLibraries() {
  992. ListScope D(W, "NeededLibraries");
  993. typedef std::vector<StringRef> LibsTy;
  994. LibsTy Libs;
  995. for (const auto &Entry : Obj->dynamic_table())
  996. if (Entry.d_tag == ELF::DT_NEEDED)
  997. Libs.push_back(Obj->getDynamicString(Entry.d_un.d_val));
  998. std::stable_sort(Libs.begin(), Libs.end());
  999. for (LibsTy::const_iterator I = Libs.begin(), E = Libs.end(); I != E; ++I) {
  1000. outs() << " " << *I << "\n";
  1001. }
  1002. }
  1003. template<class ELFT>
  1004. void ELFDumper<ELFT>::printProgramHeaders() {
  1005. ListScope L(W, "ProgramHeaders");
  1006. for (typename ELFO::Elf_Phdr_Iter PI = Obj->program_header_begin(),
  1007. PE = Obj->program_header_end();
  1008. PI != PE; ++PI) {
  1009. DictScope P(W, "ProgramHeader");
  1010. W.printHex ("Type",
  1011. getElfSegmentType(Obj->getHeader()->e_machine, PI->p_type),
  1012. PI->p_type);
  1013. W.printHex ("Offset", PI->p_offset);
  1014. W.printHex ("VirtualAddress", PI->p_vaddr);
  1015. W.printHex ("PhysicalAddress", PI->p_paddr);
  1016. W.printNumber("FileSize", PI->p_filesz);
  1017. W.printNumber("MemSize", PI->p_memsz);
  1018. W.printFlags ("Flags", PI->p_flags, makeArrayRef(ElfSegmentFlags));
  1019. W.printNumber("Alignment", PI->p_align);
  1020. }
  1021. }
  1022. template <typename ELFT>
  1023. void ELFDumper<ELFT>::printHashTable() {
  1024. DictScope D(W, "HashTable");
  1025. auto HT = Obj->getHashTable();
  1026. if (!HT)
  1027. return;
  1028. W.printNumber("Num Buckets", HT->nbucket);
  1029. W.printNumber("Num Chains", HT->nchain);
  1030. W.printList("Buckets", HT->buckets());
  1031. W.printList("Chains", HT->chains());
  1032. }
  1033. template <class ELFT>
  1034. void ELFDumper<ELFT>::printAttributes() {
  1035. W.startLine() << "Attributes not implemented.\n";
  1036. }
  1037. namespace {
  1038. template <> void ELFDumper<ELFType<support::little, false>>::printAttributes() {
  1039. if (Obj->getHeader()->e_machine != EM_ARM) {
  1040. W.startLine() << "Attributes not implemented.\n";
  1041. return;
  1042. }
  1043. DictScope BA(W, "BuildAttributes");
  1044. for (const ELFO::Elf_Shdr &Sec : Obj->sections()) {
  1045. if (Sec.sh_type != ELF::SHT_ARM_ATTRIBUTES)
  1046. continue;
  1047. ErrorOr<ArrayRef<uint8_t>> Contents = Obj->getSectionContents(&Sec);
  1048. if (!Contents)
  1049. continue;
  1050. if ((*Contents)[0] != ARMBuildAttrs::Format_Version) {
  1051. errs() << "unrecognised FormatVersion: 0x" << utohexstr((*Contents)[0])
  1052. << '\n';
  1053. continue;
  1054. }
  1055. W.printHex("FormatVersion", (*Contents)[0]);
  1056. if (Contents->size() == 1)
  1057. continue;
  1058. ARMAttributeParser(W).Parse(*Contents);
  1059. }
  1060. }
  1061. }
  1062. namespace {
  1063. template <class ELFT> class MipsGOTParser {
  1064. public:
  1065. typedef object::ELFFile<ELFT> ObjectFile;
  1066. typedef typename ObjectFile::Elf_Shdr Elf_Shdr;
  1067. typedef typename ObjectFile::Elf_Sym Elf_Sym;
  1068. MipsGOTParser(const ObjectFile *Obj, StreamWriter &W);
  1069. void parseGOT();
  1070. void parsePLT();
  1071. private:
  1072. typedef typename ObjectFile::Elf_Addr GOTEntry;
  1073. typedef typename ObjectFile::template ELFEntityIterator<const GOTEntry>
  1074. GOTIter;
  1075. const ObjectFile *Obj;
  1076. StreamWriter &W;
  1077. llvm::Optional<uint64_t> DtPltGot;
  1078. llvm::Optional<uint64_t> DtLocalGotNum;
  1079. llvm::Optional<uint64_t> DtGotSym;
  1080. llvm::Optional<uint64_t> DtMipsPltGot;
  1081. llvm::Optional<uint64_t> DtJmpRel;
  1082. std::size_t getGOTTotal(ArrayRef<uint8_t> GOT) const;
  1083. GOTIter makeGOTIter(ArrayRef<uint8_t> GOT, std::size_t EntryNum);
  1084. void printGotEntry(uint64_t GotAddr, GOTIter BeginIt, GOTIter It);
  1085. void printGlobalGotEntry(uint64_t GotAddr, GOTIter BeginIt, GOTIter It,
  1086. const Elf_Sym *Sym, bool IsDynamic);
  1087. void printPLTEntry(uint64_t PLTAddr, GOTIter BeginIt, GOTIter It,
  1088. StringRef Purpose);
  1089. void printPLTEntry(uint64_t PLTAddr, GOTIter BeginIt, GOTIter It,
  1090. const Elf_Sym *Sym);
  1091. };
  1092. }
  1093. template <class ELFT>
  1094. MipsGOTParser<ELFT>::MipsGOTParser(const ObjectFile *Obj, StreamWriter &W)
  1095. : Obj(Obj), W(W) {
  1096. for (const auto &Entry : Obj->dynamic_table()) {
  1097. switch (Entry.getTag()) {
  1098. case ELF::DT_PLTGOT:
  1099. DtPltGot = Entry.getVal();
  1100. break;
  1101. case ELF::DT_MIPS_LOCAL_GOTNO:
  1102. DtLocalGotNum = Entry.getVal();
  1103. break;
  1104. case ELF::DT_MIPS_GOTSYM:
  1105. DtGotSym = Entry.getVal();
  1106. break;
  1107. case ELF::DT_MIPS_PLTGOT:
  1108. DtMipsPltGot = Entry.getVal();
  1109. break;
  1110. case ELF::DT_JMPREL:
  1111. DtJmpRel = Entry.getVal();
  1112. break;
  1113. }
  1114. }
  1115. }
  1116. template <class ELFT> void MipsGOTParser<ELFT>::parseGOT() {
  1117. // See "Global Offset Table" in Chapter 5 in the following document
  1118. // for detailed GOT description.
  1119. // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
  1120. if (!DtPltGot) {
  1121. W.startLine() << "Cannot find PLTGOT dynamic table tag.\n";
  1122. return;
  1123. }
  1124. if (!DtLocalGotNum) {
  1125. W.startLine() << "Cannot find MIPS_LOCAL_GOTNO dynamic table tag.\n";
  1126. return;
  1127. }
  1128. if (!DtGotSym) {
  1129. W.startLine() << "Cannot find MIPS_GOTSYM dynamic table tag.\n";
  1130. return;
  1131. }
  1132. const Elf_Shdr *GOTShdr = findSectionByAddress(Obj, *DtPltGot);
  1133. if (!GOTShdr) {
  1134. W.startLine() << "There is no .got section in the file.\n";
  1135. return;
  1136. }
  1137. ErrorOr<ArrayRef<uint8_t>> GOT = Obj->getSectionContents(GOTShdr);
  1138. if (!GOT) {
  1139. W.startLine() << "The .got section is empty.\n";
  1140. return;
  1141. }
  1142. if (*DtLocalGotNum > getGOTTotal(*GOT)) {
  1143. W.startLine() << "MIPS_LOCAL_GOTNO exceeds a number of GOT entries.\n";
  1144. return;
  1145. }
  1146. const Elf_Sym *DynSymBegin = Obj->dynamic_symbol_begin();
  1147. const Elf_Sym *DynSymEnd = Obj->dynamic_symbol_end();
  1148. std::size_t DynSymTotal = std::size_t(std::distance(DynSymBegin, DynSymEnd));
  1149. if (*DtGotSym > DynSymTotal) {
  1150. W.startLine() << "MIPS_GOTSYM exceeds a number of dynamic symbols.\n";
  1151. return;
  1152. }
  1153. std::size_t GlobalGotNum = DynSymTotal - *DtGotSym;
  1154. if (*DtLocalGotNum + GlobalGotNum > getGOTTotal(*GOT)) {
  1155. W.startLine() << "Number of global GOT entries exceeds the size of GOT.\n";
  1156. return;
  1157. }
  1158. GOTIter GotBegin = makeGOTIter(*GOT, 0);
  1159. GOTIter GotLocalEnd = makeGOTIter(*GOT, *DtLocalGotNum);
  1160. GOTIter It = GotBegin;
  1161. DictScope GS(W, "Primary GOT");
  1162. W.printHex("Canonical gp value", GOTShdr->sh_addr + 0x7ff0);
  1163. {
  1164. ListScope RS(W, "Reserved entries");
  1165. {
  1166. DictScope D(W, "Entry");
  1167. printGotEntry(GOTShdr->sh_addr, GotBegin, It++);
  1168. W.printString("Purpose", StringRef("Lazy resolver"));
  1169. }
  1170. if (It != GotLocalEnd && (*It >> (sizeof(GOTEntry) * 8 - 1)) != 0) {
  1171. DictScope D(W, "Entry");
  1172. printGotEntry(GOTShdr->sh_addr, GotBegin, It++);
  1173. W.printString("Purpose", StringRef("Module pointer (GNU extension)"));
  1174. }
  1175. }
  1176. {
  1177. ListScope LS(W, "Local entries");
  1178. for (; It != GotLocalEnd; ++It) {
  1179. DictScope D(W, "Entry");
  1180. printGotEntry(GOTShdr->sh_addr, GotBegin, It);
  1181. }
  1182. }
  1183. {
  1184. ListScope GS(W, "Global entries");
  1185. GOTIter GotGlobalEnd = makeGOTIter(*GOT, *DtLocalGotNum + GlobalGotNum);
  1186. const Elf_Sym *GotDynSym = DynSymBegin + *DtGotSym;
  1187. for (; It != GotGlobalEnd; ++It) {
  1188. DictScope D(W, "Entry");
  1189. printGlobalGotEntry(GOTShdr->sh_addr, GotBegin, It, GotDynSym++, true);
  1190. }
  1191. }
  1192. std::size_t SpecGotNum = getGOTTotal(*GOT) - *DtLocalGotNum - GlobalGotNum;
  1193. W.printNumber("Number of TLS and multi-GOT entries", uint64_t(SpecGotNum));
  1194. }
  1195. template <class ELFT> void MipsGOTParser<ELFT>::parsePLT() {
  1196. if (!DtMipsPltGot) {
  1197. W.startLine() << "Cannot find MIPS_PLTGOT dynamic table tag.\n";
  1198. return;
  1199. }
  1200. if (!DtJmpRel) {
  1201. W.startLine() << "Cannot find JMPREL dynamic table tag.\n";
  1202. return;
  1203. }
  1204. const Elf_Shdr *PLTShdr = findSectionByAddress(Obj, *DtMipsPltGot);
  1205. if (!PLTShdr) {
  1206. W.startLine() << "There is no .got.plt section in the file.\n";
  1207. return;
  1208. }
  1209. ErrorOr<ArrayRef<uint8_t>> PLT = Obj->getSectionContents(PLTShdr);
  1210. if (!PLT) {
  1211. W.startLine() << "The .got.plt section is empty.\n";
  1212. return;
  1213. }
  1214. const Elf_Shdr *PLTRelShdr = findSectionByAddress(Obj, *DtJmpRel);
  1215. if (!PLTShdr) {
  1216. W.startLine() << "There is no .rel.plt section in the file.\n";
  1217. return;
  1218. }
  1219. GOTIter PLTBegin = makeGOTIter(*PLT, 0);
  1220. GOTIter PLTEnd = makeGOTIter(*PLT, getGOTTotal(*PLT));
  1221. GOTIter It = PLTBegin;
  1222. DictScope GS(W, "PLT GOT");
  1223. {
  1224. ListScope RS(W, "Reserved entries");
  1225. printPLTEntry(PLTShdr->sh_addr, PLTBegin, It++, "PLT lazy resolver");
  1226. if (It != PLTEnd)
  1227. printPLTEntry(PLTShdr->sh_addr, PLTBegin, It++, "Module pointer");
  1228. }
  1229. {
  1230. ListScope GS(W, "Entries");
  1231. switch (PLTRelShdr->sh_type) {
  1232. case ELF::SHT_REL:
  1233. for (typename ObjectFile::Elf_Rel_Iter RI = Obj->rel_begin(PLTRelShdr),
  1234. RE = Obj->rel_end(PLTRelShdr);
  1235. RI != RE && It != PLTEnd; ++RI, ++It) {
  1236. const Elf_Sym *Sym =
  1237. Obj->getRelocationSymbol(&*PLTRelShdr, &*RI).second;
  1238. printPLTEntry(PLTShdr->sh_addr, PLTBegin, It, Sym);
  1239. }
  1240. break;
  1241. case ELF::SHT_RELA:
  1242. for (typename ObjectFile::Elf_Rela_Iter RI = Obj->rela_begin(PLTRelShdr),
  1243. RE = Obj->rela_end(PLTRelShdr);
  1244. RI != RE && It != PLTEnd; ++RI, ++It) {
  1245. const Elf_Sym *Sym =
  1246. Obj->getRelocationSymbol(&*PLTRelShdr, &*RI).second;
  1247. printPLTEntry(PLTShdr->sh_addr, PLTBegin, It, Sym);
  1248. }
  1249. break;
  1250. }
  1251. }
  1252. }
  1253. template <class ELFT>
  1254. std::size_t MipsGOTParser<ELFT>::getGOTTotal(ArrayRef<uint8_t> GOT) const {
  1255. return GOT.size() / sizeof(GOTEntry);
  1256. }
  1257. template <class ELFT>
  1258. typename MipsGOTParser<ELFT>::GOTIter
  1259. MipsGOTParser<ELFT>::makeGOTIter(ArrayRef<uint8_t> GOT, std::size_t EntryNum) {
  1260. const char *Data = reinterpret_cast<const char *>(GOT.data());
  1261. return GOTIter(sizeof(GOTEntry), Data + EntryNum * sizeof(GOTEntry));
  1262. }
  1263. template <class ELFT>
  1264. void MipsGOTParser<ELFT>::printGotEntry(uint64_t GotAddr, GOTIter BeginIt,
  1265. GOTIter It) {
  1266. int64_t Offset = std::distance(BeginIt, It) * sizeof(GOTEntry);
  1267. W.printHex("Address", GotAddr + Offset);
  1268. W.printNumber("Access", Offset - 0x7ff0);
  1269. W.printHex("Initial", *It);
  1270. }
  1271. template <class ELFT>
  1272. void MipsGOTParser<ELFT>::printGlobalGotEntry(uint64_t GotAddr, GOTIter BeginIt,
  1273. GOTIter It, const Elf_Sym *Sym,
  1274. bool IsDynamic) {
  1275. printGotEntry(GotAddr, BeginIt, It);
  1276. W.printHex("Value", Sym->st_value);
  1277. W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes));
  1278. unsigned SectionIndex = 0;
  1279. StringRef SectionName;
  1280. getSectionNameIndex(*Obj, Sym, SectionName, SectionIndex);
  1281. W.printHex("Section", SectionName, SectionIndex);
  1282. std::string FullSymbolName = getFullSymbolName(*Obj, Sym, IsDynamic);
  1283. W.printNumber("Name", FullSymbolName, Sym->st_name);
  1284. }
  1285. template <class ELFT>
  1286. void MipsGOTParser<ELFT>::printPLTEntry(uint64_t PLTAddr, GOTIter BeginIt,
  1287. GOTIter It, StringRef Purpose) {
  1288. DictScope D(W, "Entry");
  1289. int64_t Offset = std::distance(BeginIt, It) * sizeof(GOTEntry);
  1290. W.printHex("Address", PLTAddr + Offset);
  1291. W.printHex("Initial", *It);
  1292. W.printString("Purpose", Purpose);
  1293. }
  1294. template <class ELFT>
  1295. void MipsGOTParser<ELFT>::printPLTEntry(uint64_t PLTAddr, GOTIter BeginIt,
  1296. GOTIter It, const Elf_Sym *Sym) {
  1297. DictScope D(W, "Entry");
  1298. int64_t Offset = std::distance(BeginIt, It) * sizeof(GOTEntry);
  1299. W.printHex("Address", PLTAddr + Offset);
  1300. W.printHex("Initial", *It);
  1301. W.printHex("Value", Sym->st_value);
  1302. W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes));
  1303. unsigned SectionIndex = 0;
  1304. StringRef SectionName;
  1305. getSectionNameIndex(*Obj, Sym, SectionName, SectionIndex);
  1306. W.printHex("Section", SectionName, SectionIndex);
  1307. std::string FullSymbolName = getFullSymbolName(*Obj, Sym, true);
  1308. W.printNumber("Name", FullSymbolName, Sym->st_name);
  1309. }
  1310. template <class ELFT> void ELFDumper<ELFT>::printMipsPLTGOT() {
  1311. if (Obj->getHeader()->e_machine != EM_MIPS) {
  1312. W.startLine() << "MIPS PLT GOT is available for MIPS targets only.\n";
  1313. return;
  1314. }
  1315. MipsGOTParser<ELFT> GOTParser(Obj, W);
  1316. GOTParser.parseGOT();
  1317. GOTParser.parsePLT();
  1318. }
  1319. static const EnumEntry<unsigned> ElfMipsISAExtType[] = {
  1320. {"None", Mips::AFL_EXT_NONE},
  1321. {"Broadcom SB-1", Mips::AFL_EXT_SB1},
  1322. {"Cavium Networks Octeon", Mips::AFL_EXT_OCTEON},
  1323. {"Cavium Networks Octeon2", Mips::AFL_EXT_OCTEON2},
  1324. {"Cavium Networks OcteonP", Mips::AFL_EXT_OCTEONP},
  1325. {"Cavium Networks Octeon3", Mips::AFL_EXT_OCTEON3},
  1326. {"LSI R4010", Mips::AFL_EXT_4010},
  1327. {"Loongson 2E", Mips::AFL_EXT_LOONGSON_2E},
  1328. {"Loongson 2F", Mips::AFL_EXT_LOONGSON_2F},
  1329. {"Loongson 3A", Mips::AFL_EXT_LOONGSON_3A},
  1330. {"MIPS R4650", Mips::AFL_EXT_4650},
  1331. {"MIPS R5900", Mips::AFL_EXT_5900},
  1332. {"MIPS R10000", Mips::AFL_EXT_10000},
  1333. {"NEC VR4100", Mips::AFL_EXT_4100},
  1334. {"NEC VR4111/VR4181", Mips::AFL_EXT_4111},
  1335. {"NEC VR4120", Mips::AFL_EXT_4120},
  1336. {"NEC VR5400", Mips::AFL_EXT_5400},
  1337. {"NEC VR5500", Mips::AFL_EXT_5500},
  1338. {"RMI Xlr", Mips::AFL_EXT_XLR},
  1339. {"Toshiba R3900", Mips::AFL_EXT_3900}
  1340. };
  1341. static const EnumEntry<unsigned> ElfMipsASEFlags[] = {
  1342. {"DSP", Mips::AFL_ASE_DSP},
  1343. {"DSPR2", Mips::AFL_ASE_DSPR2},
  1344. {"Enhanced VA Scheme", Mips::AFL_ASE_EVA},
  1345. {"MCU", Mips::AFL_ASE_MCU},
  1346. {"MDMX", Mips::AFL_ASE_MDMX},
  1347. {"MIPS-3D", Mips::AFL_ASE_MIPS3D},
  1348. {"MT", Mips::AFL_ASE_MT},
  1349. {"SmartMIPS", Mips::AFL_ASE_SMARTMIPS},
  1350. {"VZ", Mips::AFL_ASE_VIRT},
  1351. {"MSA", Mips::AFL_ASE_MSA},
  1352. {"MIPS16", Mips::AFL_ASE_MIPS16},
  1353. {"microMIPS", Mips::AFL_ASE_MICROMIPS},
  1354. {"XPA", Mips::AFL_ASE_XPA}
  1355. };
  1356. static const EnumEntry<unsigned> ElfMipsFpABIType[] = {
  1357. {"Hard or soft float", Mips::Val_GNU_MIPS_ABI_FP_ANY},
  1358. {"Hard float (double precision)", Mips::Val_GNU_MIPS_ABI_FP_DOUBLE},
  1359. {"Hard float (single precision)", Mips::Val_GNU_MIPS_ABI_FP_SINGLE},
  1360. {"Soft float", Mips::Val_GNU_MIPS_ABI_FP_SOFT},
  1361. {"Hard float (MIPS32r2 64-bit FPU 12 callee-saved)",
  1362. Mips::Val_GNU_MIPS_ABI_FP_OLD_64},
  1363. {"Hard float (32-bit CPU, Any FPU)", Mips::Val_GNU_MIPS_ABI_FP_XX},
  1364. {"Hard float (32-bit CPU, 64-bit FPU)", Mips::Val_GNU_MIPS_ABI_FP_64},
  1365. {"Hard float compat (32-bit CPU, 64-bit FPU)",
  1366. Mips::Val_GNU_MIPS_ABI_FP_64A}
  1367. };
  1368. static const EnumEntry<unsigned> ElfMipsFlags1[] {
  1369. {"ODDSPREG", Mips::AFL_FLAGS1_ODDSPREG},
  1370. };
  1371. static int getMipsRegisterSize(uint8_t Flag) {
  1372. switch (Flag) {
  1373. case Mips::AFL_REG_NONE:
  1374. return 0;
  1375. case Mips::AFL_REG_32:
  1376. return 32;
  1377. case Mips::AFL_REG_64:
  1378. return 64;
  1379. case Mips::AFL_REG_128:
  1380. return 128;
  1381. default:
  1382. return -1;
  1383. }
  1384. }
  1385. template <class ELFT> void ELFDumper<ELFT>::printMipsABIFlags() {
  1386. const Elf_Shdr *Shdr = findSectionByName(*Obj, ".MIPS.abiflags");
  1387. if (!Shdr) {
  1388. W.startLine() << "There is no .MIPS.abiflags section in the file.\n";
  1389. return;
  1390. }
  1391. ErrorOr<ArrayRef<uint8_t>> Sec = Obj->getSectionContents(Shdr);
  1392. if (!Sec) {
  1393. W.startLine() << "The .MIPS.abiflags section is empty.\n";
  1394. return;
  1395. }
  1396. if (Sec->size() != sizeof(Elf_Mips_ABIFlags<ELFT>)) {
  1397. W.startLine() << "The .MIPS.abiflags section has a wrong size.\n";
  1398. return;
  1399. }
  1400. auto *Flags = reinterpret_cast<const Elf_Mips_ABIFlags<ELFT> *>(Sec->data());
  1401. raw_ostream &OS = W.getOStream();
  1402. DictScope GS(W, "MIPS ABI Flags");
  1403. W.printNumber("Version", Flags->version);
  1404. W.startLine() << "ISA: ";
  1405. if (Flags->isa_rev <= 1)
  1406. OS << format("MIPS%u", Flags->isa_level);
  1407. else
  1408. OS << format("MIPS%ur%u", Flags->isa_level, Flags->isa_rev);
  1409. OS << "\n";
  1410. W.printEnum("ISA Extension", Flags->isa_ext, makeArrayRef(ElfMipsISAExtType));
  1411. W.printFlags("ASEs", Flags->ases, makeArrayRef(ElfMipsASEFlags));
  1412. W.printEnum("FP ABI", Flags->fp_abi, makeArrayRef(ElfMipsFpABIType));
  1413. W.printNumber("GPR size", getMipsRegisterSize(Flags->gpr_size));
  1414. W.printNumber("CPR1 size", getMipsRegisterSize(Flags->cpr1_size));
  1415. W.printNumber("CPR2 size", getMipsRegisterSize(Flags->cpr2_size));
  1416. W.printFlags("Flags 1", Flags->flags1, makeArrayRef(ElfMipsFlags1));
  1417. W.printHex("Flags 2", Flags->flags2);
  1418. }
  1419. template <class ELFT> void ELFDumper<ELFT>::printMipsReginfo() {
  1420. const Elf_Shdr *Shdr = findSectionByName(*Obj, ".reginfo");
  1421. if (!Shdr) {
  1422. W.startLine() << "There is no .reginfo section in the file.\n";
  1423. return;
  1424. }
  1425. ErrorOr<ArrayRef<uint8_t>> Sec = Obj->getSectionContents(Shdr);
  1426. if (!Sec) {
  1427. W.startLine() << "The .reginfo section is empty.\n";
  1428. return;
  1429. }
  1430. if (Sec->size() != sizeof(Elf_Mips_RegInfo<ELFT>)) {
  1431. W.startLine() << "The .reginfo section has a wrong size.\n";
  1432. return;
  1433. }
  1434. auto *Reginfo = reinterpret_cast<const Elf_Mips_RegInfo<ELFT> *>(Sec->data());
  1435. DictScope GS(W, "MIPS RegInfo");
  1436. W.printHex("GP", Reginfo->ri_gp_value);
  1437. W.printHex("General Mask", Reginfo->ri_gprmask);
  1438. W.printHex("Co-Proc Mask0", Reginfo->ri_cprmask[0]);
  1439. W.printHex("Co-Proc Mask1", Reginfo->ri_cprmask[1]);
  1440. W.printHex("Co-Proc Mask2", Reginfo->ri_cprmask[2]);
  1441. W.printHex("Co-Proc Mask3", Reginfo->ri_cprmask[3]);
  1442. }
  1443. template <class ELFT> void ELFDumper<ELFT>::printStackMap() const {
  1444. const typename ELFFile<ELFT>::Elf_Shdr *StackMapSection = nullptr;
  1445. for (const auto &Sec : Obj->sections()) {
  1446. ErrorOr<StringRef> Name = Obj->getSectionName(&Sec);
  1447. if (*Name == ".llvm_stackmaps") {
  1448. StackMapSection = &Sec;
  1449. break;
  1450. }
  1451. }
  1452. if (!StackMapSection)
  1453. return;
  1454. StringRef StackMapContents;
  1455. ErrorOr<ArrayRef<uint8_t>> StackMapContentsArray =
  1456. Obj->getSectionContents(StackMapSection);
  1457. prettyPrintStackMap(
  1458. llvm::outs(),
  1459. StackMapV1Parser<ELFT::TargetEndianness>(*StackMapContentsArray));
  1460. }