summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-06-08 03:03:00 +0000
committerUlrich Drepper <drepper@redhat.com>2000-06-08 03:03:00 +0000
commitdec126b41a0bf2d807c3fc908bd8a0f1a9fa9277 (patch)
treed61bbc6512ab4f496d69ed494f1344704cb215ec /elf
parentb8565e7817d7c6afd8eac804867b88c9bad1c9f1 (diff)
downloadglibc-dec126b41a0bf2d807c3fc908bd8a0f1a9fa9277.tar.gz
glibc-dec126b41a0bf2d807c3fc908bd8a0f1a9fa9277.tar.xz
glibc-dec126b41a0bf2d807c3fc908bd8a0f1a9fa9277.zip
Update.
	* dlfcn/dlfcn.h: Pretty print dladdr declaraction.

	* elf/rtld.c (process_envvars): Recognize LD_DYNAMIC_WEAK.
	(_dl_dynamic_weak): New variable.
	* elf/dl-support.c: Likewise.
	* sysdeps/generic/ldsodefs.h: Declare _dl_dynamic_weak.
	* elf/do-lookup.h: If we find a weak definition treat it like a
	normal symbol unless _dl_dynamic_weak is nonzero.  In the latter
	case treat it like before.
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: