1. 程式人生 > 其它 >shell 指令碼實現arm指令比對功能

shell 指令碼實現arm指令比對功能

技術標籤:技術文章

1、參考https://unix.stackexchange.com/questions/81916/how-to-find-a-space-in-a-text-using-grep找到objdum有效程式碼行

2、完整的指令碼如下(下一步改造未python方式實現)

#!/bin/bash

# the objdump format of arm similar as
# 0000000000fa19d0 <forms_>:
#   fa19d0:	d0133c81 	adrp	x1, 27733000 <fmcom_+0x26259af0>
#   fa19d4:	a9ba7bfd 	stp	x29, x30, [sp, #-96]!

if [ $# -ne 2 ]; then
	echo `basename $0`: too few arguments
	echo Usage: `basename $0` objdump1 objdump2
	exit 1
fi

FILE1OUT="$(mktemp).out1"
FILE2OUT="$(mktemp).out2"
FILE1SUM=0
FILE2SUM=0

echo "#1 = $1"
echo "#2 = $2"
grep  "^[[:space:]]\+[0-9a-zA-Z]\+:" $1 | awk '{print $3}' | sort -f | uniq -c > $FILE1OUT
grep  "^[[:space:]]\+[0-9a-zA-Z]\+:" $2 | awk '{print $3}' | sort -f | uniq -c > $FILE2OUT

printf "||= %32s =||= %6d =||= %6d =||=  Diff  =||\n" "Insn" 1 2
(cat $FILE1OUT $FILE2OUT | awk '{print $2}' | sort -f | uniq -i) > sort.tmpfile
while read i; do
    printf "|| %34s || " $i
	FILE1CNT="$(grep -i " $i$" $FILE1OUT | awk '{print $1}')"
	if [ -z "$FILE1CNT" ]; then
		FILE1CNT="0"
	fi
	FILE1SUM="$(($FILE1SUM+$FILE1CNT))"
	FILE2CNT="$(grep -i " $i$" $FILE2OUT | awk '{print $1}')"
	if [ -z "$FILE2CNT" ]; then
		FILE2CNT="0"
	fi
	FILE2SUM="$(($FILE2SUM+$FILE2CNT))"
    printf "%8d || %8d ||" $FILE1CNT $FILE2CNT
    if [ $(($FILE1CNT-$FILE2CNT)) -gt 0 ]; then
        printf " \e[1;32m%8d\e[0m ||\n" $(($FILE1CNT-$FILE2CNT))
    elif [ $(($FILE1CNT-$FILE2CNT)) -lt 0 ]; then
        printf " \e[1;31m%8d\e[0m ||\n" $(($FILE1CNT-$FILE2CNT))
    else
        echo "          ||"
    fi
done < sort.tmpfile
printf "||              **Total**             || %8d || %8d ||" $FILE1SUM $FILE2SUM
    if [ $(($FILE1SUM-$FILE2SUM)) -gt 0 ]; then
        printf " \e[1;32m%8d\e[0m ||\n" $(($FILE1SUM-$FILE2SUM))
    elif [ $(($FILE1SUM-$FILE2SUM)) -lt 0 ]; then
        printf " \e[1;31m%8d\e[0m ||\n" $(($FILE1SUM-$FILE2SUM))
    else
        echo "          ||"
    fi
rm sort.tmpfile
exit 0