Simple bash script to disassemble a single function from a ELF file:
#!/bin/bash
SECTION=$1
IN=$2
i=`nm -S --size-sort $IN | grep "\<$SECTION\>" | \
awk '{print toupper($1),toupper($2)}'`
echo "$i" | while read line; do
start=${line%% *}
size=${line##* }
end=`echo "obase=16; ibase=16; $start + $size" | bc -l`
objdump -d --section=.text \
--start-address="0x$start" \
--stop-address="0x$end" $IN
done
We may also want to generate a "binary" dump of the function (i.e., to do a binary copy of the function to a separate file); in this case the script becomes the following:
#!/bin/bash
SECTION=$1
IN=$2
i=`nm -S --size-sort $IN | grep "\<$SECTION\>" |
awk '{print toupper($1),toupper($2)}'`
echo "$i" | while read line; do
start=${line%% *}
size=${line##* }
end=`echo "obase=16; ibase=16; $start + $size" | bc -l`
objdump -d --section=.text \
--start-address="0x$start" \
--stop-address="0x$end" $IN | \
grep '[0-9a-f]:' | \
cut -f2 -d: | \
cut -f1-7 -d' ' | \
tr -s ' ' | \
tr '\t' ' ' | \
sed 's/ $//g' | \
sed 's/ /\\x/g' | \
paste -d '' -s | \
sed 's/^/"/' | \
sed 's/$/"/g' | \
sed 's:.*:echo -ne &:' | /bin/bash
done
Enjoy!