Explicitly set entry point arch when it's thumb
authorAntonio Afonso <antonio.afonso@gmail.com>
Fri, 4 Oct 2019 00:11:22 +0000 (00:11 +0000)
committerAntonio Afonso <antonio.afonso@gmail.com>
Fri, 4 Oct 2019 00:11:22 +0000 (00:11 +0000)
commitac146958041ce41aff96a2ad2a3f984fb631eb43
tree6572c6801ce0917d9815b79d7bcc332bdfd00b6a
parentebaa3eb127632851e3b7dbcceb98c0a2155c6324
Explicitly set entry point arch when it's thumb

Summary:
I found a case where the main android binary (app_process32) had thumb code at its entry point but no entry in the symbol table indicating this. This made lldb set a 4 byte breakpoint at that address (we default to arm code) instead of a 2 byte one (like we should for thumb).
The big deal with this is that the expression evaluator uses the entry point as a way to know when a JITed expression has finished executing by putting a breakpoint there. Because of this, evaluating expressions on certain android devices (Google Pixel something) made the process crash.
This was fixed by checking this specific situation when we parse the symbol table and add an artificial symbol for this 2 byte range and indicating that it's arm thumb.

I created 2 unit tests for this, one to check that now we know that the entry point is arm thumb, and the other to make sure we didn't change the behaviour for arm code.

I also run the following on the command line with the `app_process32` where I found the issue:
**Before:**
```
(lldb) dis -s 0x1640 -e 0x1644
app_process32[0x1640]: .long  0xf0004668                ; unknown opcode
```
**After:**
```
(lldb) dis -s 0x1640 -e 0x1644
app_process32`:
app_process32[0x1640] <+0>: mov    r0, sp
app_process32[0x1642]:      andeq  r0, r0, r0
```

Reviewers: clayborg, labath, wallace, espindola

Subscribers: srhines, emaste, arichardson, kristof.beyls, MaskRay, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D68069

llvm-svn: 373680
lldb/lit/SymbolFile/dissassemble-entry-point.s [new file with mode: 0644]
lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp