]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scripts/faddr2line: Combine three readelf calls into one
authorBrian Johannesmeyer <bjohannesmeyer@gmail.com>
Mon, 15 Apr 2024 14:55:33 +0000 (16:55 +0200)
committerJosh Poimboeuf <jpoimboe@kernel.org>
Wed, 3 Jul 2024 06:38:36 +0000 (23:38 -0700)
Rather than calling readelf three separate times to collect three different
types of info, call it only once, and parse out the different types of info
from its output.

Signed-off-by: Brian Johannesmeyer <bjohannesmeyer@gmail.com>
Link: https://lore.kernel.org/r/20240415145538.1938745-3-bjohannesmeyer@gmail.com
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
scripts/faddr2line

index bf394bfd526a55f49506d07230f241cca1c6fc63..f011bda4ed258f7f399f92cdf96fe92cae62718a 100755 (executable)
@@ -105,10 +105,14 @@ find_dir_prefix() {
 
 run_readelf() {
        local objfile=$1
-
-       ELF_FILEHEADER=$(${READELF} --file-header $objfile)
-       ELF_SECHEADERS=$(${READELF} --section-headers --wide $objfile)
-       ELF_SYMS=$(${READELF} --symbols --wide $objfile)
+       local out=$(${READELF} --file-header --section-headers --symbols --wide $objfile)
+
+       # 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')
 }
 
 __faddr2line() {