aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/generic
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/generic')
-rw-r--r--sysdeps/generic/dl-cache.c8
-rw-r--r--sysdeps/generic/dl-origin.c13
-rw-r--r--sysdeps/generic/dl-sysdep.c9
-rw-r--r--sysdeps/generic/ldsodefs.h44
4 files changed, 39 insertions, 35 deletions
diff --git a/sysdeps/generic/dl-cache.c b/sysdeps/generic/dl-cache.c
index 7ba00e46f7..3800a677cc 100644
--- a/sysdeps/generic/dl-cache.c
+++ b/sysdeps/generic/dl-cache.c
@@ -38,10 +38,6 @@ static size_t cachesize;
/* 1 if cache_data + PTR points into the cache. */
#define _dl_cache_verify_ptr(ptr) (ptr < cache_data_size)
-/* This is the cache ID we expect. Normally it is 3 for glibc linked
- binaries. */
-int _dl_correct_cache_id = _DL_CACHE_DEFAULT_ID;
-
#define SEARCH_CACHE(cache) \
/* We use binary search since the table is sorted in the cache file. \
The first matching entry in the table is returned. \
@@ -111,12 +107,12 @@ do \
if (_dl_cache_check_flags (flags) \
&& _dl_cache_verify_ptr (lib->value)) \
{ \
- if (best == NULL || flags == _dl_correct_cache_id) \
+ if (best == NULL || flags == GL(dl_correct_cache_id)) \
{ \
HWCAP_CHECK; \
best = cache_data + lib->value; \
\
- if (flags == _dl_correct_cache_id) \
+ if (flags == GL(dl_correct_cache_id)) \
/* We've found an exact match for the shared \
object and no general `ELF' release. Stop \
searching. */ \
diff --git a/sysdeps/generic/dl-origin.c b/sysdeps/generic/dl-origin.c
index 273ffebedf..db990e6d36 100644
--- a/sysdeps/generic/dl-origin.c
+++ b/sysdeps/generic/dl-origin.c
@@ -1,5 +1,5 @@
/* Find path of executable.
- Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@@ -25,9 +25,6 @@
#include <dl-dst.h>
-/* Generally it is not possible to implement this. We have to fall
- back on a solution where the user provides the information. */
-extern const char *_dl_origin_path;
const char *
_dl_get_origin (void)
@@ -35,15 +32,15 @@ _dl_get_origin (void)
char *result = (char *) -1;
/* We use the environment variable LD_ORIGIN_PATH. If it is set make
a copy and strip out trailing slashes. */
- if (_dl_origin_path != NULL)
+ if (GL(dl_origin_path) != NULL)
{
- size_t len = strlen (_dl_origin_path);
- result = malloc (len + 1);
+ size_t len = strlen (GL(dl_origin_path));
+ result = (char *) malloc (len + 1);
if (result == NULL)
result = (char *) -1;
else
{
- char *cp = __mempcpy (result, _dl_origin_path, len);
+ char *cp = __mempcpy (result, GL(dl_origin_path), len);
while (cp > result + 1 && cp[-1] == '/')
--cp;
*cp = '\0';
diff --git a/sysdeps/generic/dl-sysdep.c b/sysdeps/generic/dl-sysdep.c
index f8b8ac1e75..d3d5a8cefb 100644
--- a/sysdeps/generic/dl-sysdep.c
+++ b/sysdeps/generic/dl-sysdep.c
@@ -39,7 +39,6 @@
#include <hp-timing.h>
extern char **_environ;
-extern fpu_control_t _dl_fpu_control;
extern void _end;
/* Protect SUID program against misuse of file descriptors. */
@@ -54,10 +53,6 @@ int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
/* This variable contains the lowest stack address ever used. */
void *__libc_stack_end;
static ElfW(auxv_t) *_dl_auxv;
-//Xunsigned long int _dl_hwcap_mask = HWCAP_IMPORTANT;
-#if HP_TIMING_AVAIL
-hp_timing_t _dl_cpuclock_offset;
-#endif
#ifndef DL_FIND_ARG_COMPONENTS
# define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp) \
@@ -95,7 +90,7 @@ _dl_sysdep_start (void **start_argptr,
#endif
#if HP_TIMING_AVAIL
- HP_TIMING_NOW (_dl_cpuclock_offset);
+ HP_TIMING_NOW (GL(dl_cpuclock_offset));
#endif
DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, _dl_argv, _environ,
@@ -146,7 +141,7 @@ _dl_sysdep_start (void **start_argptr,
GL(dl_clktck) = av->a_un.a_val;
break;
case AT_FPUCW:
- _dl_fpu_control = av->a_un.a_val;
+ GL(dl_fpu_control) = av->a_un.a_val;
break;
}
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 52303327c0..3249105ac1 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -29,10 +29,12 @@
#include <elf.h>
#include <dlfcn.h>
+#include <fpu_control.h>
#include <sys/mman.h>
#include <link.h>
#include <dl-lookupcfg.h>
#include <bits/libc-lock.h>
+#include <hp-timing.h>
__BEGIN_DECLS
@@ -234,6 +236,15 @@ struct rtld_global
/* Cached value of `getpagesize ()'. */
EXTERN size_t _dl_pagesize;
+ /* 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_recursive (EXTERN, _dl_load_lock)
+
/* OS version. */
EXTERN unsigned int _dl_osversion;
/* Platform name. */
@@ -251,12 +262,27 @@ struct rtld_global
/* If nonzero print warnings messages. */
EXTERN int _dl_verbose;
+ /* Do we do lazy relocations? */
+ EXTERN int _dl_lazy;
+
/* Nonzero if runtime lookups should not update the .got/.plt. */
EXTERN int _dl_bind_not;
+ /* Nonzero if references should be treated as weak during runtime
+ linking. */
+ EXTERN int _dl_dynamic_weak;
+
+ /* Default floating-point control word. */
+ EXTERN fpu_control_t _dl_fpu_control;
+
/* The object to be initialized first. */
EXTERN struct link_map *_dl_initfirst;
+ /* Start time on CPU clock. */
+#if HP_TIMING_AVAIL
+ EXTERN hp_timing_t _dl_cpuclock_offset;
+#endif
+
/* Name of the shared object to be profiled (if any). */
EXTERN const char *_dl_profile;
/* Map of shared object to be profiled. */
@@ -268,7 +294,7 @@ struct rtld_global
/* Name of the object we want to trace the prelinking. */
EXTERN const char *_dl_trace_prelink;
- /* Expect cache ID. */
+ /* Expected cache ID. */
EXTERN int _dl_correct_cache_id;
/* Counters for the number of relocations performed. */
@@ -291,6 +317,9 @@ struct rtld_global
EXTERN struct r_search_path_elem *_dl_all_dirs;
EXTERN struct r_search_path_elem *_dl_init_all_dirs;
+ /* File descriptor to write debug messages to. */
+ EXTERN int _dl_debug_fd;
+
/* Structure describing the dynamic linker itself. */
EXTERN struct link_map _dl_rtld_map;
#ifdef SHARED
@@ -303,22 +332,9 @@ extern struct rtld_global _rtld_global;
extern int _dl_argc;
extern char **_dl_argv;
-/* Do we do lazy relocations? */
-extern int _dl_lazy;
-
/* The array with message we print as a last resort. */
extern const char _dl_out_of_memory[];
-/* File descriptor to write debug messages to. */
-extern int _dl_debug_fd;
-
-/* Nonzero if references should be treated as weak during runtime
- linking.
-
- XXX Once we can set the default for this variable to zero move it
- into _rtld_global. */
-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 */