[PATCH v3] scripts: check-function-names: propagate nm failures

From: Hamdy Abou El Anein

Date: Wed Nov 04 2026 - 07:07:45 EST


From: Hamdy Abou El Anein <hamdy.aea@xxxxxxxxxxxxxx>

The symbol-name check pipes nm through awk and grep. If nm cannot read
an object file, its failure status is lost and the script reports
success without checking any symbols.

Keep nm output streaming while carrying its exit status through the
filter. This avoids buffering the full vmlinux.o symbol table in a
shell variable during the serial kernel link, as the v2 did.

Tested with a malformed object (failure), a valid object (success), an
object defining startup (failure), and a synthetic large nm stream
(success).

AI assistance: ChatGPT/Codex identified the issue and prepared the
change, commit message and executable regression tests.

Signed-off-by: Hamdy Abou El Anein <hamdy.aea@xxxxxxxxxxxxxx>
---
scripts/check-function-names.sh | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/scripts/check-function-names.sh b/scripts/check-function-names.sh
index 94883e690627..b25e630cc594 100755
--- a/scripts/check-function-names.sh
+++ b/scripts/check-function-names.sh
@@ -13,9 +13,28 @@ if [ ! -f "$objfile" ]; then
exit 1
fi

-bad_symbols=$(${NM:-nm} -p "$objfile" | awk '$2 ~ /^[TtWw]$/ {print $3}' |
- grep -E '^(startup|exit|split|unlikely|hot|unknown)(\.|$)')
-
+# Keep nm output streaming while preserving its exit status.
+bad_symbols=$(
+ {
+ ${NM:-nm} -p "$objfile"
+ nm_status=$?
+ printf '\n#nm_status %s\n' "$nm_status"
+ } |
+ awk '
+ $1 == "#nm_status" {
+ if ($2 != 0)
+ nm_failed = 1
+ next
+ }
+ $2 ~ /^[TtWw]$/ && $3 ~ /^(startup|exit|split|unlikely|hot|unknown)(\.|$)/ {
+ print $3
+ }
+ END {
+ if (nm_failed)
+ exit 1
+ }
+ '
+) || exit 1
if [ -n "$bad_symbols" ]; then
echo "$bad_symbols" | while read -r sym; do
echo "$objfile: error: $sym() function name creates ambiguity with -ffunction-sections" >&2
--
2.56.0