#!/bin/bash # SPDX-License-Identifier: (GPL-2.0+ OR MIT) # # Copyright (c) 2019 Amlogic, Inc. All rights reserved. # # ./common/common_drivers/scripts/amlogic/compare_text_section --vmlinux_gki /vmlinux --vmlinux_amlogic /vmlinux function show_help { echo "USAGE:" echo echo " --vmlinux_gki ori vmlinux file, eg: /vmlinux" echo " --vmlinux_amlogic amlogic vmlinux file, eg: /vmlinux" echo " --buildtool_dir build tool bin path" echo " --output output dir, default: ./compare_text_tmp/" } for i in "$@" do case $i in --vmlinux_gki) VM_GKI_FILE=$2 shift ;; --vmlinux_amlogic) VM_AMLOGIC_FILE=$2 shift ;; --buildtool_dir) BUILDTOOL_DIR=$2 shift ;; --output) OUTPUT_DIR=$2 shift ;; -h|--help) show_help exit 0 ;; *) shift ;; esac done if [[ ! -e ${VM_GKI_FILE} ]]; then echo "gki vmlinux not exit, --vmlinux_gki ${VM_GKI_FILE}, Failed!" exit 0 fi if [[ ! -e ${VM_AMLOGIC_FILE} ]]; then echo "amlogic vmlinux not exit, --vmlinux_amlogic ${VM_AMLOGIC_FILE}, Failed!" exit 0 fi if [[ ! -d ${BUILDTOOL_DIR} ]]; then DEFAULT_BUILD_CONFIG_CONSTANTS=common/build.config.constants [[ -f ${DEFAULT_BUILD_CONFIG_CONSTANTS} ]] && source ${DEFAULT_BUILD_CONFIG_CONSTANTS} if [[ ! -d ${CLANG_PREBUILT_BIN} ]]; then echo "--buildtool_dir not exit, --buildtool_dir ${BUILDTOOL_DIR}, Failed!" exit 0 else BUILDTOOL_DIR=${CLANG_PREBUILT_BIN} fi fi if [ -z ${OUTPUT_DIR} ]; then OUTPUT_DIR=compare_text_tmp fi if [ -e ${OUTPUT_DIR} ] then rm -rf ${OUTPUT_DIR} fi echo "VM_GKI_FILE=${VM_GKI_FILE} VM_AMLOGIC_FILE=${VM_AMLOGIC_FILE} BUILDTOOL_DIR=${BUILDTOOL_DIR} OUTPUT_DIR=${OUTPUT_DIR}" mkdir -p ${OUTPUT_DIR} VM_GKI_FILE_NAME=${VM_GKI_FILE##*/}.gki VM_AMLOGIC_FILE_NAME=${VM_AMLOGIC_FILE##*/}.amlogic TEXT_GKI_FILE=${VM_GKI_FILE_NAME}.text TEXT_AMLOGIC_FILE=${VM_AMLOGIC_FILE_NAME}.text #copy vmlinux to output path cp ${VM_GKI_FILE} ${OUTPUT_DIR}/${VM_GKI_FILE_NAME} cp ${VM_AMLOGIC_FILE} ${OUTPUT_DIR}/${VM_AMLOGIC_FILE_NAME} #objdump .text section ${BUILDTOOL_DIR}/llvm-objdump --section=.text -d ${OUTPUT_DIR}/${VM_GKI_FILE_NAME} > ${OUTPUT_DIR}/${TEXT_GKI_FILE} ${BUILDTOOL_DIR}/llvm-objdump --section=.text -d ${OUTPUT_DIR}/${VM_AMLOGIC_FILE_NAME} > ${OUTPUT_DIR}/${TEXT_AMLOGIC_FILE} #only need compare until cmd column clang_hash_format=`awk 'NR==7 {print $2}' ${OUTPUT_DIR}/${TEXT_GKI_FILE}` echo clang_hash_format=${clang_hash_format} if [ $((16#${clang_hash_format})) -gt $((16#ff)) ]; then awk '{NF=3}1' ${OUTPUT_DIR}/${TEXT_GKI_FILE} > ${OUTPUT_DIR}/${TEXT_GKI_FILE}.tmp awk '{NF=3}1' ${OUTPUT_DIR}/${TEXT_AMLOGIC_FILE} > ${OUTPUT_DIR}/${TEXT_AMLOGIC_FILE}.tmp else awk '{NF=6}1' ${OUTPUT_DIR}/${TEXT_GKI_FILE} > ${OUTPUT_DIR}/${TEXT_GKI_FILE}.tmp awk '{NF=6}1' ${OUTPUT_DIR}/${TEXT_AMLOGIC_FILE} > ${OUTPUT_DIR}/${TEXT_AMLOGIC_FILE}.tmp fi diff -y --suppress-common-lines ${OUTPUT_DIR}/${TEXT_AMLOGIC_FILE}.tmp ${OUTPUT_DIR}/${TEXT_GKI_FILE}.tmp > ${OUTPUT_DIR}/diff.log.tmp #save cmd or address different line sed -i '/compare_text_tmp/d' ${OUTPUT_DIR}/diff.log.tmp if [ $((16#${clang_hash_format})) -gt $((16#ff)) ]; then awk '$1 ~ /:/ && ($1 != $5 || $3 != $7)' ${OUTPUT_DIR}/diff.log.tmp > ${OUTPUT_DIR}/diff.log else awk '$1 ~ /:/ && ($1 != $8 || $6 != $13)' ${OUTPUT_DIR}/diff.log.tmp > ${OUTPUT_DIR}/diff.log fi #output compare info if [ -s ${OUTPUT_DIR}/diff.log ]; then FIRST_ADDRESS=$(awk '{print $1}' ${OUTPUT_DIR}/diff.log | sed -n '1p') ADDR_INFO=`${BUILDTOOL_DIR}/llvm-addr2line -e ${OUTPUT_DIR}/${VM_AMLOGIC_FILE_NAME} ${FIRST_ADDRESS%%:*}` echo "Failed, first different with address: ${FIRST_ADDRESS}, info: ${ADDR_INFO}" echo "More different see the ${OUTPUT_DIR}/diff.log file" else echo "Succeed, Check not break" fi