Source
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; }')
# SPDX-License-Identifier: GPL-2.0
#
# Translate stack dump function offsets.
#
# addr2line doesn't work with KASLR addresses. This works similarly to
# addr2line, but instead takes the 'func+0x123' format as input:
#
# $ ./scripts/faddr2line ~/k/vmlinux meminfo_proc_show+0x5/0x568
# meminfo_proc_show+0x5/0x568:
# meminfo_proc_show at fs/proc/meminfo.c:27
#
# If the address is part of an inlined function, the full inline call chain is
# printed:
#
# $ ./scripts/faddr2line ~/k/vmlinux native_write_msr+0x6/0x27
# native_write_msr+0x6/0x27:
# arch_static_branch at arch/x86/include/asm/msr.h:121
# (inlined by) static_key_false at include/linux/jump_label.h:125
# (inlined by) native_write_msr at arch/x86/include/asm/msr.h:125
#
# The function size after the '/' in the input is optional, but recommended.
# It's used to help disambiguate any duplicate symbol names, which can occur
# rarely. If the size is omitted for a duplicate symbol then it's possible for
# multiple code sites to be printed:
#
# $ ./scripts/faddr2line ~/k/vmlinux raw_ioctl+0x5
# raw_ioctl+0x5/0x20:
# raw_ioctl at drivers/char/raw.c:122
#
# raw_ioctl+0x5/0xb1:
# raw_ioctl at net/ipv4/raw.c:876
#
# Multiple addresses can be specified on a single command line:
#
# $ ./scripts/faddr2line ~/k/vmlinux type_show+0x10/45 free_reserved_area+0x90
# type_show+0x10/0x2d:
# type_show at drivers/video/backlight/backlight.c:213
#
# free_reserved_area+0x90/0x123:
# free_reserved_area at mm/page_alloc.c:6429 (discriminator 2)
set -o errexit
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 ${READELF} >/dev/null 2>&1 || die "readelf 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() {
echo "usage: faddr2line [--list] <object file> <func+offset> <func+offset>..." >&2
exit 1
}
warn() {