Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scripts/faddr2line: Fix "Argument list too long" error

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>

authored by

Pankaj Raghav and committed by
Josh Poimboeuf
ff5c0466 6b4679fc

+9 -4
+9 -4
scripts/faddr2line
··· 111 111 112 112 run_readelf() { 113 113 local objfile=$1 114 - local out=$(${READELF} --file-header --section-headers --symbols --wide $objfile) 114 + local tmpfile 115 + tmpfile=$(mktemp) 116 + 117 + ${READELF} --file-header --section-headers --symbols --wide "$objfile" > "$tmpfile" 115 118 116 119 # This assumes that readelf first prints the file header, then the section headers, then the symbols. 117 120 # Note: It seems that GNU readelf does not prefix section headers with the "There are X section headers" 118 121 # line when multiple options are given, so let's also match with the "Section Headers:" line. 119 - ELF_FILEHEADER=$(echo "${out}" | sed -n '/There are [0-9]* section headers, starting at offset\|Section Headers:/q;p') 120 - 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') 121 - ELF_SYMS=$(echo "${out}" | sed -n '/Symbol table .* contains [0-9]* entries:/,$p') 122 + ELF_FILEHEADER=$(sed -n '/There are [0-9]* section headers, starting at offset\|Section Headers:/q;p' "$tmpfile") 123 + 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') 124 + ELF_SYMS=$(sed -n '/Symbol table .* contains [0-9]* entries:/,$p' "$tmpfile") 125 + 126 + rm -f -- "$tmpfile" 122 127 } 123 128 124 129 check_vmlinux() {