Viewing: objdump-resolve-str.sh

#!/usr/bin/env bash

function usage() {
	echo "Usage: $0 .."
	exit 1
}

function error() {
	echo $*
	exit 1
}

TGT=$1
[[ -z $TGT ]] && usage $*

which readelf >&/dev/null || error "install readelf"
which objdump >&/dev/null || error "install objdump"

declare -A section2num
declare -A strings

while read snum sname ooo; do
	snum=${snum//[/}
	snum=${snum//]/}
	sections="$sections $sname"
	section2num[$sname]=$snum
done <<< $(readelf -S $TGT | grep .rodata.str)

for i in $sections; do
	#echo "$i -> ${section2num[$i]}"
	while read br offset str; do
		offset=${offset//]/}
		strings[${i}+0x${offset}]=$str
	done <<< $( readelf -p ${section2num[$i]} $TGT)
done

# 12680: R_X86_64_64 .rodata.str1.8+0x38e0
nr=10
while read -r str; do
	[[ $str == *.rodata.str* ]] && {

		echo -en "\t\t\t\t$str"
		str=${str//*.rodata.str/}
		str=".rodata.str${str}"
		#echo -n "$str --- "
		echo "  # ${strings[$str]}"
		#(( nr-- == 0 )) && break
		continue
	}
	[[ $str == *R_X86_64* ]] && echo -en "\t\t\t\t"
	echo $str
done <<< $(objdump --prefix-addresses -gDr $TGT)