<div dir="ltr">Hi Peter<div><br></div><div>Thank you so much for your detail and quick reply.</div><div><br></div><div>I think I have already known how to do it on non-stripped binary. </div><div><br></div><div>Regards</div><div>Muhui</div></div><div class="gmail_extra"><br><div class="gmail_quote">2018-06-28 9:07 GMT-04:00 Peter Smith <span dir="ltr"><<a href="mailto:peter.smith@linaro.org" target="_blank">peter.smith@linaro.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello Muhui,<br>
<br>
If you are disassembling a non-stripped ELF binary you can find out<br>
the Arm/Thumb state by looking at the mapping symbols $t and $a,<br>
alternatively each ELF symbol of type STT_FUNC will have bit 0 set to<br>
0 for Arm state and bit 1 for Thumb state. Hence with the symbol table<br>
you can reconstruct the state at each address by finding a symbol.<br>
More information is available in ELF for the Arm Architecture [1].<br>
<br>
If you have got a stripped binary without any symbolic information<br>
then life gets a lot more difficult. There are some encoding rules [2]<br>
that can help you find out whether a Thumb instruction is 2 or 4 bytes<br>
long but in general you'll at least need to know whether you are<br>
starting on an Arm or Thumb instruction and will need to trace control<br>
flow instructions to track state changes and to avoid interpreting<br>
literal data as instructions.<br>
<br>
For the former I don't think you need to do much beyond reading the<br>
symbol table. I don't think LLVM does passes to reconstruct binaries,<br>
that logic would usually lie in a tool like objdump.<br>
<br>
Hope this helps<br>
<br>
Peter<br>
<br>
[1] <a href="http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044f/IHI0044F_aaelf.pdf" rel="noreferrer" target="_blank">http://infocenter.arm.com/<wbr>help/topic/com.arm.doc.<wbr>ihi0044f/IHI0044F_aaelf.pdf</a><br>
(search for mapping symbols)<br>
[2] <a href="https://developer.arm.com/products/architecture/a-profile/docs/ddi0406/latest/arm-architecture-reference-manual-armv7-a-and-armv7-r-edition" rel="noreferrer" target="_blank">https://developer.arm.com/<wbr>products/architecture/a-<wbr>profile/docs/ddi0406/latest/<wbr>arm-architecture-reference-<wbr>manual-armv7-a-and-armv7-r-<wbr>edition</a><br>
(search for Thumb instruction encoding)<br>
<br>
On 28 June 2018 at 13:32, Muhui Jiang via llvm-dev<br>
<div><div class="h5"><<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br>
> Hi<br>
><br>
> Nowadays I am using LLVM to do ARM binary analysis. I was wondering is llvm<br>
> available to provide some debugging information on the mode of ARM.<br>
><br>
> For example, llvm-dwarfdump could dump some instructions information for<br>
> debugging. Is it able to know the mode for each instruction?  Or we may<br>
> write some llvm pass to help us to know the instruction mode? Any<br>
> suggestions are welcomed. Many Thanks<br>
><br>
> Regards<br>
> Muhui<br>
><br>
</div></div>> ______________________________<wbr>_________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
><br>
</blockquote></div><br></div>