linux-yocto/scripts/faddr2line
Pankaj Raghav ec73412f61 scripts/faddr2line: Fix "Argument list too long" error
[ Upstream commit ff5c0466486ba8d07ab2700380e8fd6d5344b4e9 ]

The run_readelf() function reads the entire output of readelf into a
single shell variable. For large object files with extensive debug
information, the size of this variable can exceed the system's
command-line argument length limit.

When this variable is subsequently passed to sed via `echo "${out}"`, it
triggers an "Argument list too long" error, causing the script to fail.

Fix this by redirecting the output of readelf to a temporary file
instead of a variable. The sed commands are then modified to read from
this file, avoiding the argument length limitation entirely.

Signed-off-by: Pankaj Raghav <p.raghav@samsung.com>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2026-01-02 12:56:38 +01:00

11 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]