From 2ebfb31b35c89f8ba1da1ed8b90fba26566017a9 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Fri, 17 Oct 2025 16:13:22 -0300 Subject: [PATCH] elf: Fix tunable handing with clang Recent clang version optimizes some loops contructions to strlen [1], which might generate function calls when self-relocation is not already done (on tunable parsing). Use an out-of-line function with __attribute_optimization_barrier__ to avoid this. [1] https://github.com/llvm/llvm-project/pull/132572/commits/facd7dfc80d655fe49baf4bf27e144a4c890a149 Reviewed-by: Sam James --- elf/dl-printf.c | 1 + elf/dl-tunables.c | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/elf/dl-printf.c b/elf/dl-printf.c index ebfc7eee86..77551f99eb 100644 --- a/elf/dl-printf.c +++ b/elf/dl-printf.c @@ -35,6 +35,7 @@ /* The function might be called before the process is self-relocated. */ static size_t +__attribute_optimization_barrier__ _dl_debug_strlen (const char *s) { const char *p = s; diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c index f65480690a..f145481d55 100644 --- a/elf/dl-tunables.c +++ b/elf/dl-tunables.c @@ -37,6 +37,16 @@ #define TUNABLES_INTERNAL 1 #include "dl-tunables.h" +/* The function might be called before the process is self-relocated. */ +static size_t +__attribute_optimization_barrier__ +_dl_strlen (const char *s) +{ + const char *p = s; + for (; *s != '\0'; s++); + return s - p; +} + static char ** get_next_env (char **envp, char **name, char **val, char ***prev_envp) { @@ -324,9 +334,8 @@ __tunables_init (char **envp) if (tunable_is_name (name, envname)) { - size_t envvallen = 0; /* The environment variable is always null-terminated. */ - for (const char *p = envval; *p != '\0'; p++, envvallen++); + size_t envvallen = _dl_strlen (envval); tunables_env_alias[i] = (struct tunable_toset_t) { cur, envval, envvallen }; -- 2.47.3