From 5fba45ad1107903e37a80e47bfb21477b7ee5062 Mon Sep 17 00:00:00 2001 From: Sam Parker Date: Wed, 8 Feb 2017 09:44:18 +0000 Subject: [PATCH] Use dynamic symbols for ELF disassembly Disassembly currently begins from addresses obtained from the objects symbol table. For ELF, add the dynamic symbols to the list if no static symbols are available so that we can more successfully disassemble stripped binaries. Differential Revision: https://reviews.llvm.org/D29632 llvm-svn: 294430 --- .../tools/llvm-objdump/Inputs/stripped-elf.so | Bin 0 -> 6088 bytes .../tools/llvm-objdump/stripped-shared.test | 10 ++++ llvm/tools/llvm-objdump/llvm-objdump.cpp | 51 +++++++++++++++++- 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 llvm/test/tools/llvm-objdump/Inputs/stripped-elf.so create mode 100644 llvm/test/tools/llvm-objdump/stripped-shared.test diff --git a/llvm/test/tools/llvm-objdump/Inputs/stripped-elf.so b/llvm/test/tools/llvm-objdump/Inputs/stripped-elf.so new file mode 100644 index 0000000000000000000000000000000000000000..b88b77501d9f8763fab93eab7ed9a929e39070c5 GIT binary patch literal 6088 zcmeHLU2GIp6u#RZ+d|o0iC`&2CJMS$82X24B$d)yI$&$Cw#Z8zr`>J4WV_YfS!fXz zQ`9zqL5z_HV~pViV*)QG{w6J8;{y-HAA-h*MnlpP5-Ubi62f}Uo%?O4V`~#1e6eS< z^WF3Fopa~Ty)$>_<@(0$Sw5eDWQ#`yYvZ|&rA9dh?^F$f8c`+k=(tK0$ygOS6X0s) zw3K zaxBZPt9F>%m3dPA8*XsS0tnud#FOWz{0l))1vIOA^NowZcqmk-BhT$F%8^a~h9_FZ z(b2cUUv0Q>WUy`I=GC`zYHsfR;4+tBKc5Q5|BYeICvuDewk@ImGWwspxGzv!|NZsP ze>riG+gG07v*y!dzxl6y`>TJ1bPD-L$rc4-&@(C45JQ`T#r>GeZp~w_n#bNu_Iv5? zl^4jcTr3q+>SFL1vAjwDpjaVFgBq(DIYq6YSShMJ_E*Txd4g<Wb=TD&CuiujleP z#$lzj7mAR|qtb|!v@aE7o_-3`?CR-_n@QVB*rqAWXgq2Qvy(uWJ6f8|a3m4wiYDzy zqNS-W)*FwsSnaWh(SSF9wRL8>UaoJ(IXRd`b8YsI?QD6S5c57&94!zu zxlcQ!%>4lC_qZCDe6`+T-=*v!b-iGRekGvEj2wog!-jE}o!10p!ez%=X5W;{?w;Dy zF1zZAOjV@%!uMXR}6Za9(7`TvsUZ%?&(wmzpB)z_c zj)Ao`)MCAx{gdNqlJz@T=VdiHMyhcvcNZCqW7V|;twzbTF?7`!nD+0_YCBH_zbkMG z-e^mYb3Te+<-{*{#g9y98$;)ek!xEG-~&Peh%_Kh}UXf*vZ^AA=3Kt_>z zz!<20hg+>w&n`5MRDVX=L>qN!qMHtFqq%3v;QRf2CyO3fdziY+r(E5aM>P9>>Rbaw z@MsjbQvch@Ou5oyZIe$^g238C96$LuwP)zZx!ll;w}w*FM^d-4Q`19JZCoLff0qBD z1^j_CP5{-B*GF9r-|FlwA+quOICwjqevI&4>PC$43&Nv>KM{UJi2IH2K(p}m1%0av z^YV|=)mcYAz9*Ivzm!n;gWLT@I|EDi=N}SVi?=*ju}f&bwMU|)rO6o!B|5G=e$V<~hXv#;m(1QzUL zS2=2C-?m!m`3j4ntNj~4w^-o+<9522^(j>td#v}><_XU`ybtob3d_e1(9YbEB88bf zm)dV(?Lf_n5Am;LWk@$|TsI>vEI>ARKx zrqVP0RQdjEztJJIX%8lhIsg=D{R;ia(>J=r9 zU8tarm=*8R_C*rOXm4DrAVQf#sL(>T)s@`TT;Eu~?WuaRqH>dbD=E=J?N%}p)+oHO zad#7QN`%mp-AOxPTkS%R_u3J?E1uHZQ_)y>V>B$J)@>!bg&yvYC;NLGv=fd;RiCAp zGbX-^p4)1o=DvGj{LvVdH(a9#XO(y`v$VBX$V!^L#;n)PJ)kh z2z*RMV!mQMAVG*4+z0TnPJ!}`g#28WW5CDy;dRNm!NVx3cn6s#-gRn*`$2R_yr zkk5|={YMvmalde%#P=5u3m@!tL)P<&iJ@AtY5AS(3o2R-~})dK){%EQO_!+e4oe){A3&V0{w zBE0d?f$vdRz{Sse=isCyh;y_V9rh2&!Q+SeLBA$LgA4Fw5FO6YpXUzvcrM^O>#(|h z7&p|#b^L_5?)v!da)nQdB;-Km2tM#j^0@gzJ-6|JXd(WnhmYq~NOcf(&;hT0ksNHp t`Qv+D={$Ul1M*#>2KT=d28H1Fd+cgBC5K(J&fOJzTGjv2WkbB%^cQRe3|asH literal 0 HcmV?d00001 diff --git a/llvm/test/tools/llvm-objdump/stripped-shared.test b/llvm/test/tools/llvm-objdump/stripped-shared.test new file mode 100644 index 000000000000..c57155f4cd7b --- /dev/null +++ b/llvm/test/tools/llvm-objdump/stripped-shared.test @@ -0,0 +1,10 @@ +// This test checks that dynamic symbols are used when disassembling elf files. +// RUN: llvm-objdump -d %p/Inputs/stripped-elf.so | FileCheck %s + +# CHECK: .init +# CHECK: .plt +# CHECK: .text +# CHECK: func0 +# CHECK: func1 +# CHECK: func2 +# CHECK: .fini diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 6b8a43ea1bdd..fb144faca511 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -213,6 +213,8 @@ cl::opt cl::value_desc("address"), cl::init(UINT64_MAX)); static StringRef ToolName; +typedef std::vector> SectionSymbolsTy; + namespace { typedef std::function FilterPredicate; @@ -1108,6 +1110,52 @@ static uint8_t getElfSymbolType(const ObjectFile *Obj, const SymbolRef &Sym) { llvm_unreachable("Unsupported binary format"); } +template static void +addDynamicElfSymbols(const ELFObjectFile *Obj, + std::map &AllSymbols) { + for (auto Symbol : Obj->getDynamicSymbolIterators()) { + uint8_t SymbolType = Symbol.getELFType(); + if (SymbolType != ELF::STT_FUNC || Symbol.getSize() == 0) + continue; + + Expected AddressOrErr = Symbol.getAddress(); + if (!AddressOrErr) + report_error(Obj->getFileName(), AddressOrErr.takeError()); + uint64_t Address = *AddressOrErr; + + Expected Name = Symbol.getName(); + if (!Name) + report_error(Obj->getFileName(), Name.takeError()); + if (Name->empty()) + continue; + + Expected SectionOrErr = Symbol.getSection(); + if (!SectionOrErr) + report_error(Obj->getFileName(), SectionOrErr.takeError()); + section_iterator SecI = *SectionOrErr; + if (SecI == Obj->section_end()) + continue; + + AllSymbols[*SecI].emplace_back(Address, *Name, SymbolType); + } +} + +static void +addDynamicElfSymbols(const ObjectFile *Obj, + std::map &AllSymbols) { + assert(Obj->isELF()); + if (auto *Elf32LEObj = dyn_cast(Obj)) + addDynamicElfSymbols(Elf32LEObj, AllSymbols); + else if (auto *Elf64LEObj = dyn_cast(Obj)) + addDynamicElfSymbols(Elf64LEObj, AllSymbols); + else if (auto *Elf32BEObj = dyn_cast(Obj)) + addDynamicElfSymbols(Elf32BEObj, AllSymbols); + else if (auto *Elf64BEObj = cast(Obj)) + addDynamicElfSymbols(Elf64BEObj, AllSymbols); + else + llvm_unreachable("Unsupported binary format"); +} + static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { if (StartAddress > StopAddress) error("Start address should be less than stop address"); @@ -1182,7 +1230,6 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { // Create a mapping from virtual address to symbol name. This is used to // pretty print the symbols while disassembling. - typedef std::vector> SectionSymbolsTy; std::map AllSymbols; for (const SymbolRef &Symbol : Obj->symbols()) { Expected AddressOrErr = Symbol.getAddress(); @@ -1210,6 +1257,8 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { AllSymbols[*SecI].emplace_back(Address, *Name, SymbolType); } + if (AllSymbols.empty() && Obj->isELF()) + addDynamicElfSymbols(Obj, AllSymbols); // Create a mapping from virtual address to section. std::vector> SectionAddresses; -- GitLab