• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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