[lldb-dev] How to disassemble a section (python api)?

kwadwo amankwa via lldb-dev lldb-dev at lists.llvm.org
Fri Nov 13 15:38:15 PST 2015


Nice one ,

Cheers mate

On 13/11/15 23:30, kwadwo amankwa wrote:
> Nice one ,
>
> Cheers mate
>
> 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