mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2026-03-04 07:48:32 +01:00
There have been some recent reports of faddr2line failures:
$ scripts/faddr2line sound/soundcore.ko sound_devnode+0x5/0x35
bad symbol size: base: 0x0000000000000000 end: 0x0000000000000000
$ ./scripts/faddr2line vmlinux.o enter_from_user_mode+0x24
bad symbol size: base: 0x0000000000005fe0 end: 0x0000000000005fe0
The problem is that faddr2line is based on 'nm', which has a major
limitation: it doesn't know how to distinguish between different text
sections. So if an offset exists in multiple text sections in the
object, it may fail.
Rewrite faddr2line to be section-aware, by basing it on readelf.
Fixes: 67326666e2 ("scripts: add script for translating stack dump function offsets")
Reported-by: Kaiwan N Billimoria <kaiwan.billimoria@gmail.com>
Reported-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Link: https://lore.kernel.org/r/29ff99f86e3da965b6e46c1cc2d72ce6528c17c3.1652382321.git.jpoimboe@kernel.org
7.4 KiB
Executable File
7.4 KiB
Executable File
#!/bin/bash
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
usage() { echo "usage: faddr2line [--list]