#/bin/bash
#
#
#  2010/7/21: Pan Ruochen <panruochen@gmail.com>

if [ ! -f $1 ]; then
	exit 2
fi

EOF='====####==========================================####===='

{
	${CROSS}nm -D $1;  echo "$EOF";
	${CROSS}readelf -A $1; echo "$EOF"
	${CROSS}objdump -d $1;
} | gawk -v EOF="$EOF" -v CURFILE=1 '
$1==EOF { ++CURFILE; next; }
CURFILE==1 {
	symbols[$1] = $3;
}
CURFILE==2 {
	if($1=="Local"  && $2=="entries:") {
		flag = 1
		next
	} else if($1=="Global" && $2=="entries:") {
		flag = 2
		next
	}
	if( $1 ) {
		if ( flag == 1 ) {
			if ( $3 in symbols )
				name = symbols[$3];
			else
				name = $3
			gp_local[$2] = name
		} else if( flag == 2 ) {
			gp_global[$2] = $7
		} 
	}
}
CURFILE==3 {
	n = match($0, /[ls]w	t9,(.+\(gp\))/, m);
	if(n > 0) {
		gp = substr($0, m[1,"start"], m[1,"length"]);
		if( gp in gp_local )
			name = gp_local[gp];
		else if ( gp in gp_global )
			name = gp_global[gp];
		t9 = name
	}
	if( name != "" )
		printf("%s /*guess:%s*/\n", $0, name)
	else {
		if( $0 ~ /jalr	t9/ && t9 != "" ) {
			printf("%s <%s>\n", $0, t9)
			t9 = ""
		} else
			print $0
	}
	name = "";
}'


