aboutsummaryrefslogtreecommitdiff
path: root/elf
diff options
context:
space:
mode:
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-support.c3
-rw-r--r--elf/do-lookup.h20
-rw-r--r--elf/rtld.c13
3 files changed, 25 insertions, 11 deletions
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 68973cc5c1..4006d960dd 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -42,6 +42,7 @@ int _dl_debug_versions;
int _dl_debug_reloc;
int _dl_debug_files;
int _dl_lazy;
+int _dl_dynamic_weak;
/* If nonzero print warnings about problematic situations. */
int _dl_verbose;
@@ -107,6 +108,8 @@ non_dynamic_init (void)
_dl_lazy = *(getenv ("LD_BIND_NOW") ?: "") == '\0';
+ _dl_dynamic_weak = *(getenv ("LD_DYNAMIC_WEAK") ?: "") == '\0';
+
#ifdef DL_PLATFORM_INIT
DL_PLATFORM_INIT;
#endif
diff --git a/elf/do-lookup.h b/elf/do-lookup.h
index 873e95322c..ffc98ab624 100644
--- a/elf/do-lookup.h
+++ b/elf/do-lookup.h
@@ -157,19 +157,23 @@ FCT (const char *undef_name, struct link_map *undef_map,
found_it:
switch (ELFW(ST_BIND) (sym->st_info))
{
+ case STB_WEAK:
+ /* Weak definition. Use this value if we don't find another. */
+ if (__builtin_expect (_dl_dynamic_weak, 0))
+ {
+ if (! result->s)
+ {
+ result->s = sym;
+ result->m = map;
+ }
+ break;
+ }
+ /* FALLTHROUGH */
case STB_GLOBAL:
/* Global definition. Just what we need. */
result->s = sym;
result->m = map;
return 1;
- case STB_WEAK:
- /* Weak definition. Use this value if we don't find another. */
- if (! result->s)
- {
- result->s = sym;
- result->m = map;
- }
- break;
default:
/* Local symbols are ignored. */
break;
diff --git a/elf/rtld.c b/elf/rtld.c
index f358700466..6bf1dba089 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -87,6 +87,7 @@ const char *_dl_profile;
const char *_dl_profile_output;
struct link_map *_dl_profile_map;
int _dl_lazy;
+int _dl_dynamic_weak;
int _dl_debug_libs;
int _dl_debug_impcalls;
int _dl_debug_bindings;
@@ -1393,6 +1394,13 @@ process_envvars (enum mode *modep, int *lazyp)
break;
case 12:
+ /* The library search path. */
+ if (memcmp (&envline[3], "LIBRARY_PATH", 12) == 0)
+ {
+ library_path = &envline[16];
+ break;
+ }
+
/* Where to place the profiling data file. */
if (memcmp (&envline[3], "DEBUG_OUTPUT", 12) == 0)
{
@@ -1400,9 +1408,8 @@ process_envvars (enum mode *modep, int *lazyp)
break;
}
- /* The library search path. */
- if (memcmp (&envline[3], "LIBRARY_PATH", 12) == 0)
- library_path = &envline[16];
+ if (memcmp (&envline[3], "DYNAMIC_WEAK", 12) == 0)
+ _dl_dynamic_weak = 1;
break;
case 14: