Commit 95a87982 authored by Liu, Changcheng's avatar Liu, Changcheng Committed by Linus Torvalds

scripts/faddr2line: extend usage on generic arch

When cross-compiling, fadd2line should use the binary tool used for the
target system, rather than that of the host.

Link: http://lkml.kernel.org/r/20171121092911.GA150711@sofiaSigned-off-by: default avatarLiu Changcheng <changcheng.liu@intel.com>
Cc: Kate Stewart <kstewart@linuxfoundation.org>
Cc: NeilBrown <neilb@suse.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 5c9d2d5c
...@@ -44,9 +44,16 @@ ...@@ -44,9 +44,16 @@
set -o errexit set -o errexit
set -o nounset set -o nounset
READELF="${CROSS_COMPILE}readelf"
ADDR2LINE="${CROSS_COMPILE}addr2line"
SIZE="${CROSS_COMPILE}size"
NM="${CROSS_COMPILE}nm"
command -v awk >/dev/null 2>&1 || die "awk isn't installed" command -v awk >/dev/null 2>&1 || die "awk isn't installed"
command -v readelf >/dev/null 2>&1 || die "readelf isn't installed" command -v ${READELF} >/dev/null 2>&1 || die "readelf isn't installed"
command -v addr2line >/dev/null 2>&1 || die "addr2line isn't installed" command -v ${ADDR2LINE} >/dev/null 2>&1 || die "addr2line isn't installed"
command -v ${SIZE} >/dev/null 2>&1 || die "size isn't installed"
command -v ${NM} >/dev/null 2>&1 || die "nm isn't installed"
usage() { usage() {
echo "usage: faddr2line <object file> <func+offset> <func+offset>..." >&2 echo "usage: faddr2line <object file> <func+offset> <func+offset>..." >&2
...@@ -69,10 +76,10 @@ die() { ...@@ -69,10 +76,10 @@ die() {
find_dir_prefix() { find_dir_prefix() {
local objfile=$1 local objfile=$1
local start_kernel_addr=$(readelf -sW $objfile | awk '$8 == "start_kernel" {printf "0x%s", $2}') local start_kernel_addr=$(${READELF} -sW $objfile | awk '$8 == "start_kernel" {printf "0x%s", $2}')
[[ -z $start_kernel_addr ]] && return [[ -z $start_kernel_addr ]] && return
local file_line=$(addr2line -e $objfile $start_kernel_addr) local file_line=$(${ADDR2LINE} -e $objfile $start_kernel_addr)
[[ -z $file_line ]] && return [[ -z $file_line ]] && return
local prefix=${file_line%init/main.c:*} local prefix=${file_line%init/main.c:*}
...@@ -104,7 +111,7 @@ __faddr2line() { ...@@ -104,7 +111,7 @@ __faddr2line() {
# Go through each of the object's symbols which match the func name. # Go through each of the object's symbols which match the func name.
# In rare cases there might be duplicates. # In rare cases there might be duplicates.
file_end=$(size -Ax $objfile | awk '$1 == ".text" {print $2}') file_end=$(${SIZE} -Ax $objfile | awk '$1 == ".text" {print $2}')
while read symbol; do while read symbol; do
local fields=($symbol) local fields=($symbol)
local sym_base=0x${fields[0]} local sym_base=0x${fields[0]}
...@@ -156,10 +163,10 @@ __faddr2line() { ...@@ -156,10 +163,10 @@ __faddr2line() {
# pass real address to addr2line # pass real address to addr2line
echo "$func+$offset/$sym_size:" echo "$func+$offset/$sym_size:"
addr2line -fpie $objfile $addr | sed "s; $dir_prefix\(\./\)*; ;" ${ADDR2LINE} -fpie $objfile $addr | sed "s; $dir_prefix\(\./\)*; ;"
DONE=1 DONE=1
done < <(nm -n $objfile | awk -v fn=$func -v end=$file_end '$3 == fn { found=1; line=$0; start=$1; next } found == 1 { found=0; print line, "0x"$1 } END {if (found == 1) print line, end; }') done < <(${NM} -n $objfile | awk -v fn=$func -v end=$file_end '$3 == fn { found=1; line=$0; start=$1; next } found == 1 { found=0; print line, "0x"$1 } END {if (found == 1) print line, end; }')
} }
[[ $# -lt 2 ]] && usage [[ $# -lt 2 ]] && usage
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment