1#!/bin/bash 2 3# Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 4# Copyright (c) 2020-2022 Huawei Device Co., Ltd. All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without modification, 7# are permitted provided that the following conditions are met: 8# 9# 1. Redistributions of source code must retain the above copyright notice, this list of 10# conditions and the following disclaimer. 11# 12# 2. Redistributions in binary form must reproduce the above copyright notice, this list 13# of conditions and the following disclaimer in the documentation and/or other materials 14# provided with the distribution. 15# 16# 3. Neither the name of the copyright holder nor the names of its contributors may be used 17# to endorse or promote products derived from this software without specific prior written 18# permission. 19# 20# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 22# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 24# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 27# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 28# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 29# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 30# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31set -e 32 33LOAD_BASE="0x2000000" 34LLVM_ADDR2LINE=llvm-addr2line 35GCC_ADDR2LINE=addr2line 36 37get_line() 38{ 39 SYM_ADDR=$(echo $1 | awk '{print $2}') 40 ELF_OFFSET=$(echo ${SYM_ADDR} | cut -d '[' -f2 | cut -d ']' -f1) 41 FILE_LINE=$(${ADDR2LINE} -f -e $2 ${ELF_OFFSET} | awk 'NR==2') 42 if [[ "${FILE_LINE}" == *"?"* ]]; then 43 typeset ELF_OFFSET=$((ELF_OFFSET+LOAD_BASE)) 44 ELF_OFFSET=$(echo "obase=16;${ELF_OFFSET}" | bc) 45 FILE_LINE=$(${ADDR2LINE} -f -e $2 ${ELF_OFFSET} | awk 'NR==2') 46 fi 47 echo ${FILE_LINE} 48} 49 50parse_line() 51{ 52 FILE_PATH=$(echo $1 | awk '{print $4}') 53 ELF_FILE=${FILE_PATH##*/} 54 ELF_FILE=${ELF_FILE//[$'\t\r\n']} 55 FLAG=false 56 for i in $2; do 57 if [ "${ELF_FILE}" = "$i" ]; then 58 if [ ! -f "$i" ]; then 59 echo "Error: no such file: $i" 60 exit 1 61 fi 62 ELF_FILE_LINE=$(get_line "$1" $i) 63 if [[ "${ELF_FILE_LINE}" == *"?"* ]] || [ -z "${ELF_FILE_LINE}" ]; then 64 echo " * Error: you need ensure whether file: "$i" was compiled with -g or not! *" 65 exit 1 66 fi 67 LINE=$(echo $1 | tr -d '\r') 68 LINE=$(echo ${LINE} | awk '{print $1,$2}') 69 echo " "${LINE}" at "${ELF_FILE_LINE} 70 FLAG=true 71 break 72 fi 73 done 74 if [[ "${FLAG}" == "false" ]]; then 75 echo " "$1 76 fi 77} 78 79if [ $# -le 1 ]; then 80 echo "Usage: ./out2line.sh text.txt elf1 elf2 ..." 81 exit 1 82fi 83 84read -n5 -p "Compiler is [gcc/llvm]: " ANSWER 85case "${ANSWER}" in 86(gcc | GCC) 87 which ${GCC_ADDR2LINE} >/dev/null 2>&1 88 if [ $? -eq 0 ]; then 89 ADDR2LINE=${GCC_ADDR2LINE} 90 else 91 echo "${GCC_ADDR2LINE} command not found!" 92 exit 1 93 fi;; 94(llvm | LLVM) 95 which ${LLVM_ADDR2LINE} >/dev/null 2>&1 96 if [ $? -eq 0 ]; then 97 ADDR2LINE=${LLVM_ADDR2LINE} 98 else 99 echo "${LLVM_ADDR2LINE} command not found! Trying to use ${GCC_ADDR2LINE}!" 100 which ${GCC_ADDR2LINE} >/dev/null 2>&1 101 if [ $? -eq 0 ]; then 102 ADDR2LINE=${GCC_ADDR2LINE} 103 else 104 echo "${GCC_ADDR2LINE} command not found!" 105 exit 1 106 fi 107 fi;; 108(*) 109 echo "Error choise!" 110 exit 1 111esac 112echo -e "Now using ${ADDR2LINE} ...\n" 113 114PARAM_LIST="${*:2}" 115cat $1 | while read line; do 116 HEAD_STRING=$(echo ${line} | awk '{print $1}') 117 if [[ "${HEAD_STRING}" == *"#"* ]]; then 118 parse_line "${line}" "${PARAM_LIST}" 119 else 120 if [[ "${HEAD_STRING}" == *"["* ]]; then 121 echo " "${line} 122 else 123 echo ${line} 124 fi 125 fi 126done 127 128