Signed-off-by: Pierre Habouzit <madcoder@debian.org>
--- /dev/null
+#!/bin/bash
+
+exe="$1"
+sym="$2"
+
+die() {
+ echo "$@" >&2
+ exit 1
+}
+
+get_sym() {
+ objdump -j .text -tT "$1" | grep " $2\$" || die "symbol not found"
+}
+
+hex_to_d() { printf "%d" "$1"; }
+sum_hex() { expr $(hex_to_d "$1") + $(hex_to_d "$2"); }
+
+do_dump() {
+ local addr=0x$1
+ local size=0x$2
+ objdump -dS --start-address=$addr --stop-address=$(printf "0x%016x" $(sum_hex $addr $size)) "$exe"
+}
+
+render_it() {
+ local esc=$(printf "\033")
+
+ sed -e "/^ [a-f0-9]\+:/{s/^.*$/$esc[34m&$esc[0m/}"
+}
+
+get_sym "$exe" "$sym" | while read addr flags1 flags2 sect size rest; do
+ pager=
+ if test -n "$TERM" -a "$TERM" != "dumb"; then
+ do_dump "$addr" "$size" | render_it | env LESS=FRSX less
+ else
+ do_dump "$addr" "$size" | render_it
+ fi
+done