* 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.
2000-06-07 Ulrich Drepper <drepper@redhat.com>
+ * 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.
+
* elf/dl-addr.c (_dl_addr): Fill in correct information if symbol
is in main program.
* elf/Versions [ld] (GLIBC_2.2): Export _dl_argv.
extern char *dlerror (void) __THROW;
#ifdef __USE_GNU
+/* Structure containing information about object searched using
+ `dladdr'. */
+typedef struct
+{
+ __const char *dli_fname; /* File name of defining object. */
+ void *dli_fbase; /* Load address of that object. */
+ __const char *dli_sname; /* Name of nearest symbol. */
+ void *dli_saddr; /* Exact value of nearest symbol. */
+} Dl_info;
+
/* Fill in *INFO with the following information about ADDRESS.
Returns 0 iff no shared object's segments contain that address. */
-typedef struct
- {
- __const char *dli_fname; /* File name of defining object. */
- void *dli_fbase; /* Load address of that object. */
- __const char *dli_sname; /* Name of nearest symbol. */
- void *dli_saddr; /* Exact value of nearest symbol. */
- } Dl_info;
extern int dladdr (const void *__address, Dl_info *__info) __THROW;
#endif
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;
_dl_lazy = *(getenv ("LD_BIND_NOW") ?: "") == '\0';
+ _dl_dynamic_weak = *(getenv ("LD_DYNAMIC_WEAK") ?: "") == '\0';
+
#ifdef DL_PLATFORM_INIT
DL_PLATFORM_INIT;
#endif
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;
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;
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)
{
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:
/* Names of shared object for which the RPATH should be ignored. */
extern const char *_dl_inhibit_rpath;
+/* Nonzero if references should be treated as weak during runtime linking. */
+extern int _dl_dynamic_weak;
+
/* OS-dependent function to open the zero-fill device. */
extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */