[PATCH 47/59] elf: Fix tunable handing with clang

Sam James sam@gentoo.org
Mon Oct 20 19:32:22 GMT 2025


Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:

> 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.

Reviewed-by: Sam James <sam@gentoo.org>

>
> [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 };


More information about the Libc-alpha mailing list