Jump visualization feature for objdump.
Fangrui Song
i@maskray.me
Thu Nov 7 05:54:00 GMT 2019
On 2019-11-06, Thomas Troeger wrote:
>Dear all,
>
>I have written a program that adds visualization of jumps inside a function to the output of objdump in the form of a post-processor
>
>$ objdump -wzSCD binary | postprocessor
>
>Is that feature interesting enough to include it into objdump, for example behind a command-line switch like `--visualize-jumps'? If yes, what is the workflow to add this feature? I could of course port it from my tool, which is written in C++14, but there is the question who will review a patch for inclusion when I have it finished, and what are other prerequisites (source code formatting, test cases ...)?
>
>Please enlighten me with your answers.
>
>Regards,
>Thomas.
>
>P.S.: Example output from a running `/bin/bash' process (the program does other stuff besides the visualization):
>
>000055edb4520380 <unset_bash_input@@Base>:
> 55edb4520380: 8b 05 9a 53 0e 00 mov 0xe539a(%rip),%eax # 115720 <default_buffered_input@@Base> -> 55edb451d03d
> 55edb4520386: 85 ff test %edi,%edi
> 55edb4520388: /-------- 75 3e jne 303c8 <unset_bash_input@@Base+0x48> -> 55edb45203c8
> 55edb452038a: | 85 c0 test %eax,%eax
> 55edb452038c: | /-- 7e 32 jle 303c0 <unset_bash_input@@Base+0x40> -> 55edb45203c0
> 55edb452038e: | /--|-> 48 83 ec 08 sub $0x8,%rsp
> 55edb4520392: | | | 89 c7 mov %eax,%edi
> 55edb4520394: | | | e8 f7 47 04 00 callq 74b90 <close_buffered_fd@@Base> -> 55edb4564b90
> 55edb4520399: | | | c7 05 ad 25 0f 00 ff ff ff ff movl $0xffffffff,0xf25ad(%rip) # 122950 <bash_input@@Base+0x10> -> 55edb45ca79d
> 55edb45203a3: | | | c7 05 73 53 0e 00 ff ff ff ff movl $0xffffffff,0xe5373(%rip) # 115720 <default_buffered_input@@Base> -> 55edb451d03d
> 55edb45203ad: | | | c7 05 89 25 0f 00 00 00 00 00 movl $0x0,0xf2589(%rip) # 122940 <bash_input@@Base> -> 55edb45ca78d
> 55edb45203b7: | | | 48 83 c4 08 add $0x8,%rsp
> 55edb45203bb: | | | c3 retq
> 55edb45203bc: | | | 0f 1f 40 00 nopl 0x0(%rax)
> 55edb45203c0: | | \-> c3 retq
> 55edb45203c1: | | 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
> 55edb45203c8: \--|----> 85 c0 test %eax,%eax
> 55edb45203ca: \----- 79 c2 jns 3038e <unset_bash_input@@Base+0xe> -> 55edb452038e
> 55edb45203cc: c3 retq
> 55edb45203cd: 0f 1f 00 nopl (%rax)
>
>[...]
>
>000055edb45218a0 <with_input_from_stdin@@Base>:
> 55edb45218a0: 83 3d 99 10 0f 00 01 cmpl $0x1,0xf1099(%rip) # 122940 <bash_input@@Base> -> 55edb45ca78d
> 55edb45218a7: /----------------- 74 4f je 318f8 <with_input_from_stdin@@Base+0x58> -> 55edb45218f8
> 55edb45218a9: | 48 8b 05 d8 c5 0e 00 mov 0xec5d8(%rip),%rax # 11de88 <stream_list@@Base> -> 55edb451d017
> 55edb45218b0: | 48 85 c0 test %rax,%rax
> 55edb45218b3: | /-------- 74 19 je 318ce <with_input_from_stdin@@Base+0x2e> -> 55edb45218ce
> 55edb45218b5: | | 83 78 08 01 cmpl $0x1,0x8(%rax)
> 55edb45218b9: | | /----- 75 0b jne 318c6 <with_input_from_stdin@@Base+0x26> -> 55edb45218c6
> 55edb45218bb: | /-----|--|----- eb 3c jmp 318f9 <with_input_from_stdin@@Base+0x59> -> 55edb45218f9
> 55edb45218bd: | | | | 0f 1f 00 nopl (%rax)
> 55edb45218c0: | | | | /-> 83 78 08 01 cmpl $0x1,0x8(%rax)
> 55edb45218c4: | | /--|--|--|-- 74 32 je 318f8 <with_input_from_stdin@@Base+0x58> -> 55edb45218f8
> 55edb45218c6: | | | | \--|-> 48 8b 00 mov (%rax),%rax
> 55edb45218c9: | | | | | 48 85 c0 test %rax,%rax
> 55edb45218cc: | | | | \-- 75 f2 jne 318c0 <with_input_from_stdin@@Base+0x20> -> 55edb45218c0
> 55edb45218ce: | | | \-------> 4c 8b 05 cb c5 0e 00 mov 0xec5cb(%rip),%r8 # 11dea0 <current_readline_line@@Base> -> 55edb451d017
> 55edb45218d5: | | | 48 8d 0d 85 9d 0a 00 lea 0xa9d85(%rip),%rcx # db661 <_IO_stdin_used@@Base+0x661>
> 55edb45218dc: | | | ba 01 00 00 00 mov $0x1,%edx
> 55edb45218e1: | | | 48 8d 35 a8 f1 ff ff lea -0xe58(%rip),%rsi # 30a90 <pretty_print_loop@@Base+0xd0> -> 55edb4520a90
> 55edb45218e8: | | | 48 8d 3d 51 f4 ff ff lea -0xbaf(%rip),%rdi # 30d40 <pretty_print_loop@@Base+0x380> -> 55edb4520d40
> 55edb45218ef: | | | e9 0c ff ff ff jmpq 31800 <init_yy_io@@Base> -> 55edb4521800
> 55edb45218f4: | | | 0f 1f 40 00 nopl 0x0(%rax)
> 55edb45218f8: \--|--\----------> c3 retq
> 55edb45218f9: \-------------> c3 retq
> 55edb45218fa: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
radare2[1] can draw such edges and even control flow graphs[2] in the terminal.
I wonder what people think of doing more "UI" work in the standard
disassembly utility, objdump.
(radare2 uses capstone as its default disassembler backend. capstone was
created from rewriting part of 2014 llvm MC C++ code in C. IIRC it is
more difficult to upgrade to a newer llvm, than rewriting it.)
[1]: https://rada.re/n/
[2]: https://monosource.gitbooks.io/radare2-explorations/content/intro/visual_graphs.html
More information about the Binutils
mailing list