shell 指令碼實現arm指令比對功能
阿新 • • 發佈:2021-02-07
技術標籤:技術文章
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