#!/bin/sh

LC_ALL=C
export LC_ALL

if test $# -lt 1; then
	exit 5
fi

exefile="$1"
shift

tmp_file=`mktemp /tmp/do-syms.XXXXXX`
test $? || exit 1

tmp_file1=`mktemp /tmp/do-syms.XXXXXX`
test $? || exit 2

tmp_file2=`mktemp /tmp/do-syms.XXXXXX`
test $? || exit 3

trap 'rm -f $tmp_file $tmp_file1 $tmp_file2' 0 1 2 3 15

cat "$@" > "$tmp_file"

awk '
/\[0x[0-9a-fA-F]+\]/ {
	match($0, /\[0x[0-9a-fA-F]+\]/)
	print substr($0, RSTART + 1, RLENGTH - 2)
}' "$tmp_file" | sort | uniq | tee $tmp_file1 |
xargs addr2line -e "$exefile" > $tmp_file2

awk -v tmp1=$tmp_file1 -v tmp2=$tmp_file2 '
BEGIN {
	while (0 < getline addr < tmp1 && 0 < getline src < tmp2){
		h [addr] = src
#		print addr, h [addr]
	}
}
{
	match($0, /\[0x[0-9a-fA-F]+\]/)
	if (RSTART > 0){
		addr = substr($0, RSTART + 1, RLENGTH - 2)
		print substr($0, 1, RSTART - 1), h [addr]
	}else{
		print $0
	}
}'
