[lldb-dev] How to disassemble a section (python api)?
kwadwo amankwa via lldb-dev
lldb-dev at lists.llvm.org
Fri Nov 13 15:31:27 PST 2015
On 13/11/15 19:31, Greg Clayton wrote:
> Currently you can't disassemble a section, nor would you probably want to since there are padding bytes in between functions.
>
> The easiest way is to get all SBSymbol objects and ask each one for the instructions if they are code:
>
> (lldb) script
> Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.
>>>> module = lldb.target.module['a.out']
>>>> num_symbols = module.GetNumSymbols()
>>>> for i in range(num_symbols):
> ... symbol = module.GetSymbolAtIndex(i)
> ... if symbol.GetType() == lldb.eSymbolTypeCode:
> ... print symbol
> ... instructions = symbol.GetInstructions(lldb.target)
> ... for inst in instructions:
> ... print inst
> ...
> id = {0x00000004}, range = [0x0000000100000f00-0x0000000100000f20), name="foo(float)", mangled="_Z3foof"
> a.out[0x100000f00]: pushq %rbp
> a.out[0x100000f01]: movq %rsp, %rbp
> a.out[0x100000f04]: movss %xmm0, -0x4(%rbp)
> a.out[0x100000f09]: cvttss2si -0x4(%rbp), %eax
> a.out[0x100000f0e]: shll $0x1, %eax
> a.out[0x100000f11]: popq %rbp
> a.out[0x100000f12]: retq
> a.out[0x100000f13]: nopw %cs:(%rax,%rax)
> id = {0x00000008}, range = [0x0000000100000f20-0x0000000100000f40), name="foo(int)", mangled="_Z3fooi"
> a.out[0x100000f20]: pushq %rbp
> a.out[0x100000f21]: movq %rsp, %rbp
> a.out[0x100000f24]: movl %edi, -0x4(%rbp)
> a.out[0x100000f27]: movl -0x4(%rbp), %edi
> a.out[0x100000f2a]: shll $0x2, %edi
> a.out[0x100000f2d]: movl %edi, %eax
> a.out[0x100000f2f]: popq %rbp
> a.out[0x100000f30]: retq
> a.out[0x100000f31]: nopw %cs:(%rax,%rax)
> id = {0x0000000c}, range = [0x0000000100000f40-0x0000000100000f90), name="main"
> a.out[0x100000f40]: pushq %rbp
> a.out[0x100000f41]: movq %rsp, %rbp
> a.out[0x100000f44]: subq $0x30, %rsp
> a.out[0x100000f48]: movss 0x40(%rip), %xmm0
> a.out[0x100000f50]: movl $0x0, -0x4(%rbp)
> a.out[0x100000f57]: movl %edi, -0x8(%rbp)
> a.out[0x100000f5a]: movq %rsi, -0x10(%rbp)
> a.out[0x100000f5e]: movq %rdx, -0x18(%rbp)
> a.out[0x100000f62]: movss %xmm0, -0x1c(%rbp)
> a.out[0x100000f67]: movl $0x4d2, -0x20(%rbp)
> a.out[0x100000f6e]: movss -0x1c(%rbp), %xmm0
> a.out[0x100000f73]: callq 0x100000f00
> a.out[0x100000f78]: movl -0x20(%rbp), %edi
> a.out[0x100000f7b]: movl %eax, -0x24(%rbp)
> a.out[0x100000f7e]: callq 0x100000f20
> a.out[0x100000f83]: movl -0x24(%rbp), %edi
> a.out[0x100000f86]: addl %eax, %edi
> a.out[0x100000f88]: movl %edi, %eax
> a.out[0x100000f8a]: addq $0x30, %rsp
> a.out[0x100000f8e]: popq %rbp
> a.out[0x100000f8f]: retq
>
> If you want the symbols only from a specific section you can get the section from the symbol's start address and compare that to a given name:
>
> section_name = ".text"
> for i in range(num_symbols):
> symbol = module.GetSymbolAtIndex(i)
> if symbol.GetType() == lldb.eSymbolTypeCode:
> symbol_section = symbol.GetStartAddress().GetSection()
> if symbol_section.GetName() == section_name:
> print symbol
> instructions = symbol.GetInstructions(lldb.target)
> for inst in instructions:
> print inst
>
>
>
>
>
>> On Nov 12, 2015, at 2:13 PM, kwadwo amankwa via lldb-dev <lldb-dev at lists.llvm.org> wrote:
>>
>> Hi
>> I'm writing a small script and need to disassemble a whole section , what would be the correct way to go about it ?
>>
>> Cheers Que,
>> _______________________________________________
>> lldb-dev mailing list
>> lldb-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
More information about the lldb-dev
mailing list