mirror of
https://sourceware.org/git/glibc.git
synced 2025-11-05 08:10:46 +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. */
|
/* The function might be called before the process is self-relocated. */
|
||||||
static size_t
|
static size_t
|
||||||
|
__attribute_optimization_barrier__
|
||||||
_dl_debug_strlen (const char *s)
|
_dl_debug_strlen (const char *s)
|
||||||
{
|
{
|
||||||
const char *p = s;
|
const char *p = s;
|
||||||
|
|||||||
@@ -37,6 +37,16 @@
|
|||||||
#define TUNABLES_INTERNAL 1
|
#define TUNABLES_INTERNAL 1
|
||||||
#include "dl-tunables.h"
|
#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 **
|
static char **
|
||||||
get_next_env (char **envp, char **name, char **val, char ***prev_envp)
|
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))
|
if (tunable_is_name (name, envname))
|
||||||
{
|
{
|
||||||
size_t envvallen = 0;
|
|
||||||
/* The environment variable is always null-terminated. */
|
/* 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] =
|
tunables_env_alias[i] =
|
||||||
(struct tunable_toset_t) { cur, envval, envvallen };
|
(struct tunable_toset_t) { cur, envval, envvallen };
|
||||||
|
|||||||
Reference in New Issue
Block a user