]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scripts/faddr2line: Fix "Argument list too long" error
authorPankaj Raghav <p.raghav@samsung.com>
Sun, 21 Sep 2025 10:03:58 +0000 (12:03 +0200)
committerJosh Poimboeuf <jpoimboe@kernel.org>
Tue, 14 Oct 2025 21:45:20 +0000 (14:45 -0700)
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>
scripts/faddr2line

index 7746d4ad0bfa0e9b1c5a6105c7717688c4b2475e..622875396bcfcb155e6fd93805e0761245d35d7f 100755 (executable)
@@ -111,14 +111,19 @@ find_dir_prefix() {
 
 run_readelf() {
        local objfile=$1
-       local out=$(${READELF} --file-header --section-headers --symbols --wide $objfile)
+       local tmpfile
+       tmpfile=$(mktemp)
+
+       ${READELF} --file-header --section-headers --symbols --wide "$objfile" > "$tmpfile"
 
        # This assumes that readelf first prints the file header, then the section headers, then the symbols.
        # Note: It seems that GNU readelf does not prefix section headers with the "There are X section headers"
        # line when multiple options are given, so let's also match with the "Section Headers:" line.
-       ELF_FILEHEADER=$(echo "${out}" | sed -n '/There are [0-9]* section headers, starting at offset\|Section Headers:/q;p')
-       ELF_SECHEADERS=$(echo "${out}" | sed -n '/There are [0-9]* section headers, starting at offset\|Section Headers:/,$p' | sed -n '/Symbol table .* contains [0-9]* entries:/q;p')
-       ELF_SYMS=$(echo "${out}" | sed -n '/Symbol table .* contains [0-9]* entries:/,$p')
+       ELF_FILEHEADER=$(sed -n '/There are [0-9]* section headers, starting at offset\|Section Headers:/q;p' "$tmpfile")
+       ELF_SECHEADERS=$(sed -n '/There are [0-9]* section headers, starting at offset\|Section Headers:/,$p' "$tmpfile" | sed -n '/Symbol table .* contains [0-9]* entries:/q;p')
+       ELF_SYMS=$(sed -n '/Symbol table .* contains [0-9]* entries:/,$p' "$tmpfile")
+
+       rm -f -- "$tmpfile"
 }
 
 check_vmlinux() {