mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	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] facd7dfc80
Reviewed-by: Sam James <sam@gentoo.org>
			
			
This commit is contained in:
		@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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 };
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user