diff options
Diffstat (limited to 'elf')
-rw-r--r-- | elf/Versions | 10 | ||||
-rw-r--r-- | elf/dl-close.c | 6 | ||||
-rw-r--r-- | elf/dl-iteratephdr.c | 4 | ||||
-rw-r--r-- | elf/dl-lookup.c | 4 | ||||
-rw-r--r-- | elf/dl-misc.c | 10 | ||||
-rw-r--r-- | elf/dl-open.c | 6 | ||||
-rw-r--r-- | elf/dl-support.c | 6 | ||||
-rw-r--r-- | elf/do-lookup.h | 2 | ||||
-rw-r--r-- | elf/rtld.c | 63 |
9 files changed, 55 insertions, 56 deletions
diff --git a/elf/Versions b/elf/Versions index 5c8da22843..af4f4b84a8 100644 --- a/elf/Versions +++ b/elf/Versions @@ -30,9 +30,6 @@ libc { ld { GLIBC_2.0 { - # global variables - _dl_debug_fd; - # Those are in the dynamic linker, but used by libc.so. __libc_enable_secure; _dl_catch_error; _dl_check_all_versions; _dl_debug_initialize; _dl_debug_state; @@ -48,20 +45,17 @@ ld { } GLIBC_2.1 { # global variables - _dl_fpu_control; __libc_stack_end; + __libc_stack_end; # functions used in other libraries _dl_start_profile; _dl_mcount; _dl_unload_cache; } GLIBC_2.1.1 { - # global variables - _dl_lazy; - # functions used in other libraries _dl_dst_count; _dl_dst_substitute; } GLIBC_2.2 { - _dl_init; _dl_load_lock; _dl_argv; _dl_check_map_versions; + _dl_init; _dl_argv; _dl_check_map_versions; # variables used elsewhere _dl_out_of_memory; diff --git a/elf/dl-close.c b/elf/dl-close.c index cece96b7fb..65de9e7809 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -57,7 +57,7 @@ _dl_close (void *_map) _dl_signal_error (0, map->l_name, NULL, N_("shared object not open")); /* Acquire the lock. */ - __libc_lock_lock_recursive (_dl_load_lock); + __libc_lock_lock_recursive (GL(dl_load_lock)); /* Decrement the reference count. */ if (map->l_opencount > 1 || map->l_type != lt_loaded) @@ -70,7 +70,7 @@ _dl_close (void *_map) /* One decrement the object itself, not the dependencies. */ --map->l_opencount; - __libc_lock_unlock_recursive (_dl_load_lock); + __libc_lock_unlock_recursive (GL(dl_load_lock)); return; } @@ -298,7 +298,7 @@ _dl_close (void *_map) free (list); /* Release the lock. */ - __libc_lock_unlock_recursive (_dl_load_lock); + __libc_lock_unlock_recursive (GL(dl_load_lock)); } diff --git a/elf/dl-iteratephdr.c b/elf/dl-iteratephdr.c index e2a5d2a753..3145e382aa 100644 --- a/elf/dl-iteratephdr.c +++ b/elf/dl-iteratephdr.c @@ -32,7 +32,7 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, int ret = 0; /* Make sure we are alone. */ - __libc_lock_lock_recursive (_dl_load_lock); + __libc_lock_lock_recursive (GL(dl_load_lock)); for (l = GL(dl_loaded); l != NULL; l = l->l_next) { @@ -49,7 +49,7 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, } /* Release the lock. */ - __libc_lock_unlock_recursive (_dl_load_lock); + __libc_lock_unlock_recursive (GL(dl_load_lock)); return ret; } diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index f10ff4739d..695ce54b4e 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -94,7 +94,7 @@ add_dependency (struct link_map *undef_map, struct link_map *map) return 0; /* Make sure nobody can unload the object while we are at it. */ - __libc_lock_lock_recursive (_dl_load_lock); + __libc_lock_lock_recursive (GL(dl_load_lock)); /* Determine whether UNDEF_MAP already has a reference to MAP. First look in the normal dependencies. */ @@ -180,7 +180,7 @@ add_dependency (struct link_map *undef_map, struct link_map *map) out: /* Release the lock. */ - __libc_lock_unlock_recursive (_dl_load_lock); + __libc_lock_unlock_recursive (GL(dl_load_lock)); return result; } diff --git a/elf/dl-misc.c b/elf/dl-misc.c index a96689edf7..d4d9d13e03 100644 --- a/elf/dl-misc.c +++ b/elf/dl-misc.c @@ -1,5 +1,5 @@ /* Miscellaneous support functions for dynamic linker - Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -80,10 +80,6 @@ _dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot) } -/* Descriptor to write debug messages to. */ -int _dl_debug_fd = 2; - - /* Bare-bone printf implementation. This function only knows about the formats and flags needed and can handle only up to 64 stripes in the output. */ @@ -250,7 +246,7 @@ _dl_debug_printf (const char *fmt, ...) va_list arg; va_start (arg, fmt); - _dl_debug_vdprintf (_dl_debug_fd, 1, fmt, arg); + _dl_debug_vdprintf (GL(dl_debug_fd), 1, fmt, arg); va_end (arg); } @@ -262,7 +258,7 @@ _dl_debug_printf_c (const char *fmt, ...) va_list arg; va_start (arg, fmt); - _dl_debug_vdprintf (_dl_debug_fd, -1, fmt, arg); + _dl_debug_vdprintf (GL(dl_debug_fd), -1, fmt, arg); va_end (arg); } diff --git a/elf/dl-open.c b/elf/dl-open.c index 2f82e4cf40..56b6cbb319 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -259,7 +259,7 @@ dl_open_worker (void *a) #endif /* Only do lazy relocation if `LD_BIND_NOW' is not set. */ - lazy = (mode & RTLD_BINDING_MASK) == RTLD_LAZY && _dl_lazy; + lazy = (mode & RTLD_BINDING_MASK) == RTLD_LAZY && GL(dl_lazy); /* Relocate the objects loaded. We do this in reverse order so that copy relocs of earlier objects overwrite the data written by later objects. */ @@ -400,7 +400,7 @@ _dl_open (const char *file, int mode, const void *caller) _dl_signal_error (EINVAL, file, NULL, N_("invalid mode for dlopen()")); /* Make sure we are alone. */ - __libc_lock_lock_recursive (_dl_load_lock); + __libc_lock_lock_recursive (GL(dl_load_lock)); args.file = file; args.mode = mode; @@ -414,7 +414,7 @@ _dl_open (const char *file, int mode, const void *caller) #endif /* Release the lock. */ - __libc_lock_unlock_recursive (_dl_load_lock); + __libc_lock_unlock_recursive (GL(dl_load_lock)); if (errstring) { diff --git a/elf/dl-support.c b/elf/dl-support.c index 0efbcc4cb6..b78b79d6d9 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -27,6 +27,7 @@ #include <ldsodefs.h> #include <dl-machine.h> #include <bits/libc-lock.h> +#include <dl-cache.h> #include <dl-librecon.h> #include <unsecvars.h> #include <hp-timing.h> @@ -119,6 +120,11 @@ struct r_search_path_elem *_dl_init_all_dirs; /* The object to be initialized first. */ struct link_map *_dl_initfirst; +/* Descriptor to write debug messages to. */ +int _dl_debug_fd = STDERR_FILENO; + +int _dl_correct_cache_id = _DL_CACHE_DEFAULT_ID; + /* During the program run we must not modify the global data of loaded shared object simultanously in two threads. Therefore we protect `_dl_open' and `_dl_close' in dl-close.c. diff --git a/elf/do-lookup.h b/elf/do-lookup.h index 65f7b02a20..18d1ab5bfe 100644 --- a/elf/do-lookup.h +++ b/elf/do-lookup.h @@ -160,7 +160,7 @@ FCT (const char *undef_name, unsigned long int hash, const ElfW(Sym) *ref, { case STB_WEAK: /* Weak definition. Use this value if we don't find another. */ - if (__builtin_expect (_dl_dynamic_weak, 0)) + if (__builtin_expect (GL(dl_dynamic_weak), 0)) { if (! result->s) { diff --git a/elf/rtld.c b/elf/rtld.c index 050d7fae8a..e4c2c6e0ad 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -33,6 +33,8 @@ #include "dynamic-link.h" #include "dl-librecon.h" #include <unsecvars.h> +#include <dl-cache.h> +#include <dl-procinfo.h> #include <assert.h> @@ -58,25 +60,6 @@ static void process_envvars (enum mode *modep); int _dl_argc; char **_dl_argv; unsigned int _dl_skip_args; /* Nonzero if we were run directly. */ -fpu_control_t _dl_fpu_control = _FPU_DEFAULT; -int _dl_lazy = 1; -/* XXX I know about at least one case where we depend on the old weak - behavior (it has to do with librt). Until we get DSO groups implemented - we have to make this the default. Bummer. --drepper */ -#if 0 -int _dl_dynamic_weak; -#else -int _dl_dynamic_weak = 1; -#endif - -/* During the program run we must not modify the global data of - loaded shared object simultanously in two threads. Therefore we - protect `_dl_open' and `_dl_close' in dl-close.c. - - This must be a recursive lock since the initializer function of - the loaded object might as well require a call to this function. - At this time it is not anymore a problem to modify the tables. */ -__libc_lock_define_initialized_recursive (, _dl_load_lock) /* Set nonzero during loading and initialization of executable and libraries, cleared before the executable's entry point runs. This @@ -89,7 +72,26 @@ int _dl_starting_up; /* This is the structure which defines all variables global to ld.so (except those which cannot be added for some reason). */ -struct rtld_global _rtld_global; +struct rtld_global _rtld_global = + { + ._dl_debug_fd = STDERR_FILENO, +#if 1 + /* XXX I know about at least one case where we depend on the old + weak behavior (it has to do with librt). Until we get DSO + groups implemented we have to make this the default. + Bummer. --drepper */ + ._dl_dynamic_weak = 1, +#endif + ._dl_lazy = 1, + ._dl_fpu_control = _FPU_DEFAULT, + ._dl_correct_cache_id = _DL_CACHE_DEFAULT_ID, + ._dl_hwcap_mask = HWCAP_IMPORTANT, + ._dl_load_lock = _LIBC_LOCK_RECURSIVE_INITIALIZER + }; +/* There must only be the definition in ld.so itself. */ +#ifdef HAVE_PROTECTED +asm (".protected _rtld_global"); +#endif static void dl_main (const ElfW(Phdr) *phdr, @@ -418,7 +420,7 @@ dl_main (const ElfW(Phdr) *phdr, if (! strcmp (_dl_argv[1], "--list")) { mode = list; - _dl_lazy = -1; /* This means do no dependency analysis. */ + GL(dl_lazy) = -1; /* This means do no dependency analysis. */ ++_dl_skip_args; --_dl_argc; @@ -941,13 +943,13 @@ of this helper program; chances are you did not intend to run this program.\n\ else { /* If LD_WARN is set warn about undefined symbols. */ - if (_dl_lazy >= 0 && GL(dl_verbose)) + if (GL(dl_lazy) >= 0 && GL(dl_verbose)) { /* We have to do symbol dependency testing. */ struct relocate_args args; struct link_map *l; - args.lazy = _dl_lazy; + args.lazy = GL(dl_lazy); l = GL(dl_loaded); while (l->l_next) @@ -1142,7 +1144,7 @@ of this helper program; chances are you did not intend to run this program.\n\ #endif /* If we are profiling we also must do lazy reloaction. */ - _dl_lazy |= consider_profiling; + GL(dl_lazy) |= consider_profiling; l = GL(dl_loaded); while (l->l_next) @@ -1163,7 +1165,7 @@ of this helper program; chances are you did not intend to run this program.\n\ } if (l != &GL(dl_rtld_map)) - _dl_relocate_object (l, l->l_scope, _dl_lazy, consider_profiling); + _dl_relocate_object (l, l->l_scope, GL(dl_lazy), consider_profiling); l = l->l_prev; } @@ -1327,6 +1329,7 @@ process_dl_debug (const char *dl_debug) && debopts[cnt].name[len] == '\0') { GL(dl_debug_mask) |= debopts[cnt].mask; + any_debug = 1; break; } @@ -1428,7 +1431,7 @@ process_envvars (enum mode *modep) /* Do we bind early? */ if (memcmp (envline, "BIND_NOW", 8) == 0) { - _dl_lazy = envline[9] == '\0'; + GL(dl_lazy) = envline[9] == '\0'; break; } if (memcmp (envline, "BIND_NOT", 8) == 0) @@ -1471,7 +1474,7 @@ process_envvars (enum mode *modep) } if (memcmp (envline, "DYNAMIC_WEAK", 12) == 0) - _dl_dynamic_weak = 1; + GL(dl_dynamic_weak) = 1; break; case 14: @@ -1553,10 +1556,10 @@ process_envvars (enum mode *modep) *--startp = '.'; startp = memcpy (startp - name_len, debug_output, name_len); - _dl_debug_fd = __open (startp, flags, DEFFILEMODE); - if (_dl_debug_fd == -1) + GL(dl_debug_fd) = __open (startp, flags, DEFFILEMODE); + if (GL(dl_debug_fd) == -1) /* We use standard output if opening the file failed. */ - _dl_debug_fd = STDOUT_FILENO; + GL(dl_debug_fd) = STDOUT_FILENO; } } |