More generic code.
[~madcoder/dotfiles.git] / +bin / objdump-sym
1 #!/bin/bash
2
3 exe="$1"
4 sym="$2"
5
6 die() {
7     echo "$@" >&2
8     exit 1
9 }
10
11 get_sym() {
12     objdump -j .text -tT "$1" | grep " $2\$" || die "symbol not found"
13 }
14
15 hex_to_d() { printf "%d" "$1"; }
16 sum_hex()  { expr $(hex_to_d "$1") + $(hex_to_d "$2"); }
17
18 do_dump() {
19     local addr=0x$1
20     local size=0x$2
21     objdump -dS --start-address=$addr --stop-address=$(printf "0x%016x" $(sum_hex $addr $size)) "$exe"
22 }
23
24 render_it() {
25     local esc=$(printf "\033")
26
27     sed -e "/^  [a-f0-9]\+:/{s/^.*$/$esc[34m&$esc[0m/}"
28 }
29
30 get_sym "$exe" "$sym" | while read addr flags1 flags2 sect size rest; do
31     pager=
32     if test -n "$TERM" -a "$TERM" != "dumb"; then
33         do_dump "$addr" "$size" | render_it | env LESS=FRSX less
34     else
35         do_dump "$addr" "$size" | render_it
36     fi
37 done