[PATCH 47/59] elf: Fix tunable handing with clang
Adhemerval Zanella
adhemerval.zanella@linaro.org
Fri Oct 17 19:13:22 GMT 2025
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
---
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.43.0
More information about the Libc-alpha
mailing list