aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/generic
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/generic')
-rw-r--r--sysdeps/generic/dl-cache.c5
-rw-r--r--sysdeps/generic/dl-fptr.c20
-rw-r--r--sysdeps/generic/dl-origin.c2
-rw-r--r--sysdeps/generic/dl-sysdep.c4
-rw-r--r--sysdeps/generic/dl-tls.c28
-rw-r--r--sysdeps/generic/ldsodefs.h128
-rw-r--r--sysdeps/generic/libc-start.c4
7 files changed, 93 insertions, 98 deletions
diff --git a/sysdeps/generic/dl-cache.c b/sysdeps/generic/dl-cache.c
index 5a44148a44..2861dc2613 100644
--- a/sysdeps/generic/dl-cache.c
+++ b/sysdeps/generic/dl-cache.c
@@ -188,7 +188,7 @@ _dl_load_cache_lookup (const char *name)
/* Print a message if the loading of libs is traced. */
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0))
- INTUSE(_dl_debug_printf) (" search cache=%s\n", LD_SO_CACHE);
+ _dl_debug_printf (" search cache=%s\n", LD_SO_CACHE);
if (cache == NULL)
{
@@ -291,7 +291,7 @@ _dl_load_cache_lookup (const char *name)
/* Print our result if wanted. */
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0)
&& best != NULL)
- INTUSE(_dl_debug_printf) (" trying file=%s\n", best);
+ _dl_debug_printf (" trying file=%s\n", best);
return best;
}
@@ -310,5 +310,4 @@ _dl_unload_cache (void)
cache = NULL;
}
}
-INTDEF (_dl_unload_cache)
#endif
diff --git a/sysdeps/generic/dl-fptr.c b/sysdeps/generic/dl-fptr.c
index 1ed463717d..78beecfdcb 100644
--- a/sysdeps/generic/dl-fptr.c
+++ b/sysdeps/generic/dl-fptr.c
@@ -1,5 +1,5 @@
/* Manage function descriptors. Generic version.
- Copyright (C) 1999,2000,2001,2002,2003 Free Software Foundation, Inc.
+ Copyright (C) 1999,2000,2001,2002,2003,2004 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,12 +80,12 @@ new_fdesc_table (struct local *l, size_t *size)
if (! COMPARE_AND_SWAP (&l->npages, old_npages, new_npages))
return (struct fdesc_table *) NULL;
- *size = old_npages * GL(dl_pagesize);
+ *size = old_npages * GLRO(dl_pagesize);
new_table = __mmap (NULL, *size,
PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
if (new_table == MAP_FAILED)
- INTUSE(_dl_signal_error) (errno, NULL, NULL,
- N_("cannot map pages for fdesc table"));
+ _dl_signal_error (errno, NULL, NULL,
+ N_("cannot map pages for fdesc table"));
new_table->len
= (*size - sizeof (*new_table)) / sizeof (struct fdesc);
@@ -178,8 +178,8 @@ make_fptr_table (struct link_map *map)
afterwards... */
len = ((strtab - (char *) symtab)
/ map->l_info[DT_SYMENT]->d_un.d_val);
- size = ((len * sizeof (fptr_table[0]) + GL(dl_pagesize) - 1)
- & -GL(dl_pagesize));
+ size = ((len * sizeof (fptr_table[0]) + GLRO(dl_pagesize) - 1)
+ & -GLRO(dl_pagesize));
/* XXX We don't support here in the moment systems without MAP_ANON.
There probably are none for IA-64. In case this is proven wrong
we will have to open /dev/null here and use the file descriptor
@@ -188,8 +188,8 @@ make_fptr_table (struct link_map *map)
PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE,
-1, 0);
if (fptr_table == MAP_FAILED)
- INTUSE(_dl_signal_error) (errno, NULL, NULL,
- N_("cannot map pages for fptr table"));
+ _dl_signal_error (errno, NULL, NULL,
+ N_("cannot map pages for fptr table"));
if (COMPARE_AND_SWAP ((ElfW(Addr) *) &map->l_mach.fptr_table,
(ElfW(Addr)) NULL, (ElfW(Addr)) fptr_table))
@@ -217,8 +217,8 @@ _dl_make_fptr (struct link_map *map, const ElfW(Sym) *sym,
symidx = sym - symtab;
if (symidx >= map->l_mach.fptr_table_len)
- INTUSE(_dl_signal_error) (0, NULL, NULL, N_("\
-internal error: symidx out of range of fptr table"));
+ _dl_signal_error (0, NULL, NULL,
+ N_("internal error: symidx out of range of fptr table"));
while (ftab[symidx] == 0)
{
diff --git a/sysdeps/generic/dl-origin.c b/sysdeps/generic/dl-origin.c
index 4837c2e721..87619379bc 100644
--- a/sysdeps/generic/dl-origin.c
+++ b/sysdeps/generic/dl-origin.c
@@ -26,7 +26,6 @@
#include <dl-dst.h>
-#undef _dl_get_origin
const char *
_dl_get_origin (void)
{
@@ -50,4 +49,3 @@ _dl_get_origin (void)
return result;
}
-INTDEF(_dl_get_origin)
diff --git a/sysdeps/generic/dl-sysdep.c b/sysdeps/generic/dl-sysdep.c
index e9eccd5dc3..3447f4cd4c 100644
--- a/sysdeps/generic/dl-sysdep.c
+++ b/sysdeps/generic/dl-sysdep.c
@@ -416,8 +416,8 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
#ifndef USE_TLS
no_memory:
#endif
- INTUSE(_dl_signal_error) (ENOMEM, NULL, NULL,
- N_("cannot create capability list"));
+ _dl_signal_error (ENOMEM, NULL, NULL,
+ N_("cannot create capability list"));
}
if (cnt == 1)
diff --git a/sysdeps/generic/dl-tls.c b/sysdeps/generic/dl-tls.c
index e0ffcc06d3..4fe67da4e1 100644
--- a/sysdeps/generic/dl-tls.c
+++ b/sysdeps/generic/dl-tls.c
@@ -1,5 +1,5 @@
/* Thread-local storage handling in the ELF dynamic linker. Generic version.
- Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2003, 2004 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
@@ -505,32 +505,6 @@ rtld_hidden_def (_dl_deallocate_tls)
# ifndef GET_ADDR_OFFSET
# define GET_ADDR_OFFSET ti->ti_offset
# endif
-/* Systems which do not have tls_index also probably have to define
- DONT_USE_TLS_INDEX. */
-
-# ifndef __TLS_GET_ADDR
-# define __TLS_GET_ADDR __tls_get_addr
-# endif
-
-
-/* Return the symbol address given the map of the module it is in and
- the symbol record. This is used in dl-sym.c. */
-void *
-internal_function
-_dl_tls_symaddr (struct link_map *map, const ElfW(Sym) *ref)
-{
-# ifndef DONT_USE_TLS_INDEX
- tls_index tmp =
- {
- .ti_module = map->l_tls_modid,
- .ti_offset = ref->st_value
- };
-
- return __TLS_GET_ADDR (&tmp);
-# else
- return __TLS_GET_ADDR (map->l_tls_modid, ref->st_value);
-# endif
-}
static void *
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 98294cb05d..e6e144f9eb 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -447,14 +447,74 @@ struct rtld_global_ro
#endif
#ifdef SHARED
+ /* We add a function table to _rtld_global which is then used to
+ call the function instead of going through the PLT. The result
+ is that we can avoid exporting the functions and we do not jump
+ PLT relocations in libc.so. */
+ const char *(*_dl_get_origin) (void);
+ size_t (*_dl_dst_count) (const char *, int);
+ char *(*_dl_dst_substitute) (struct link_map *, const char *, char *, int);
+ struct link_map *(internal_function *_dl_map_object) (struct link_map *,
+ const char *, int,
+ int, int, int);
+ void (internal_function *_dl_map_object_deps) (struct link_map *,
+ struct link_map **,
+ unsigned int, int, int);
+ void (*_dl_relocate_object) (struct link_map *, struct r_scope_elem *[],
+ int, int);
+ int (internal_function *_dl_check_map_versions) (struct link_map *, int,
+ int);
+ void (internal_function *_dl_init) (struct link_map *, int, char **,
+ char **);
+ void (*_dl_debug_state) (void);
+#ifndef MAP_COPY
+ void (*_dl_unload_cache) (void);
+#endif
+ void (*_dl_debug_printf) (const char *, ...)
+ __attribute__ ((__format__ (__printf__, 1, 2)));
+ int (internal_function *_dl_catch_error) (const char **, const char **,
+ void (*) (void *), void *);
+ void (internal_function *_dl_signal_error) (int, const char *, const char *,
+ const char *);
+ void (internal_function *_dl_start_profile) (struct link_map *,
+ const char *);
+ void (*_dl_mcount) (ElfW(Addr) frompc, ElfW(Addr) selfpc);
+ lookup_t (internal_function *_dl_lookup_symbol) (const char *,
+ struct link_map *,
+ const ElfW(Sym) **,
+ struct r_scope_elem *[],
+ int, int);
+ lookup_t (internal_function *_dl_lookup_versioned_symbol) (const char *,
+ struct link_map *,
+ const ElfW(Sym) **,
+ struct r_scope_elem *[],
+ const struct r_found_version *,
+ int, int);
+ lookup_t (internal_function *_dl_lookup_symbol_skip) (const char *,
+ struct link_map *,
+ const ElfW(Sym) **,
+ struct r_scope_elem *[],
+ struct link_map *);
+ lookup_t (internal_function *_dl_lookup_versioned_symbol_skip) (const char *,
+ struct link_map *,
+ const ElfW(Sym) **,
+ struct r_scope_elem *[],
+ const struct r_found_version *,
+ struct link_map *);
+
};
# define __rtld_global_attribute__
# ifdef IS_IN_rtld
extern struct rtld_global_ro _rtld_local_ro
attribute_relro __rtld_local_attribute__;
-# endif
extern struct rtld_global_ro _rtld_global_ro
attribute_relro __rtld_global_attribute__;
+# else
+/* We cheat a bit here. We declare the variable as as const even
+ though it is at startup. */
+extern const struct rtld_global_ro _rtld_global_ro
+ attribute_relro __rtld_global_attribute__;
+# endif
#endif
#undef EXTERN
@@ -518,10 +578,7 @@ extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */
interpreted as for a `printf' call. All the lines start with a
tag showing the PID. */
extern void _dl_debug_printf (const char *fmt, ...)
- __attribute__ ((__format__ (__printf__, 1, 2)));
-extern void _dl_debug_printf_internal (const char *fmt, ...)
- __attribute__ ((__format__ (__printf__, 1, 2)))
- attribute_hidden;
+ __attribute__ ((__format__ (__printf__, 1, 2))) attribute_hidden;
/* Write message on the debug file descriptor. The parameters are
interpreted as for a `printf' call. All the lines buf the first
@@ -564,11 +621,6 @@ extern void _dl_dprintf (int fd, const char *fmt, ...)
problem. */
extern void _dl_signal_error (int errcode, const char *object,
const char *occurred, const char *errstring)
- internal_function
- __attribute__ ((__noreturn__));
-extern void _dl_signal_error_internal (int errcode, const char *object,
- const char *occurred,
- const char *errstring)
internal_function __attribute__ ((__noreturn__)) attribute_hidden;
/* Like _dl_signal_error, but may return when called in the context of
@@ -594,12 +646,6 @@ extern void _dl_receive_error (receiver_fct fct, void (*operate) (void *),
extern struct link_map *_dl_map_object (struct link_map *loader,
const char *name, int preloaded,
int type, int trace_mode, int mode)
- internal_function;
-extern struct link_map *_dl_map_object_internal (struct link_map *loader,
- const char *name,
- int preloaded,
- int type, int trace_mode,
- int mode)
internal_function attribute_hidden;
/* Call _dl_map_object on the dependencies of MAP, and set up
@@ -610,11 +656,6 @@ extern void _dl_map_object_deps (struct link_map *map,
struct link_map **preloads,
unsigned int npreloads, int trace_mode,
int open_mode)
- internal_function;
-extern void _dl_map_object_deps_internal (struct link_map *map,
- struct link_map **preloads,
- unsigned int npreloads,
- int trace_mode, int open_mode)
internal_function attribute_hidden;
/* Cache the locations of MAP's hash table. */
@@ -646,12 +687,6 @@ extern lookup_t _dl_lookup_symbol (const char *undef,
const ElfW(Sym) **sym,
struct r_scope_elem *symbol_scope[],
int type_class, int flags)
- internal_function;
-extern lookup_t _dl_lookup_symbol_internal (const char *undef,
- struct link_map *undef_map,
- const ElfW(Sym) **sym,
- struct r_scope_elem *symbolscope[],
- int type_class, int flags)
internal_function attribute_hidden;
enum
@@ -670,14 +705,6 @@ extern lookup_t _dl_lookup_versioned_symbol (const char *undef,
struct r_scope_elem *symbol_scope[],
const struct r_found_version *version,
int type_class, int explicit)
- internal_function;
-extern lookup_t _dl_lookup_versioned_symbol_internal (const char *undef,
- struct link_map *undef_map,
- const ElfW(Sym) **sym,
- struct r_scope_elem *symbol_scope[],
- const struct r_found_version *version,
- int type_class,
- int explicit)
internal_function attribute_hidden;
/* For handling RTLD_NEXT we must be able to skip shared objects. */
@@ -713,10 +740,7 @@ extern struct link_map *_dl_new_object (char *realname, const char *libname,
If LAZY is nonzero, don't relocate its PLT. */
extern void _dl_relocate_object (struct link_map *map,
struct r_scope_elem *scope[],
- int lazy, int consider_profiling);
-extern void _dl_relocate_object_internal (struct link_map *map,
- struct r_scope_elem *scope[],
- int lazy, int consider_profiling)
+ int lazy, int consider_profiling)
attribute_hidden;
/* Protect PT_GNU_RELRO area. */
@@ -750,7 +774,7 @@ extern int _dl_check_map_versions (struct link_map *map, int verbose,
/* Initialize the object in SCOPE by calling the constructors with
ARGC, ARGV, and ENV as the parameters. */
extern void _dl_init (struct link_map *main_map, int argc, char **argv,
- char **env) internal_function;
+ char **env) internal_function attribute_hidden;
/* Call the finalizer functions of all shared objects whose
initializer functions have completed. */
@@ -760,8 +784,7 @@ extern void _dl_fini (void) internal_function;
any shared object mappings. The `r_state' member of `struct r_debug'
says what change is taking place. This function's address is
the value of the `r_brk' member. */
-extern void _dl_debug_state (void);
-extern void _dl_debug_state_internal (void) attribute_hidden;
+extern void _dl_debug_state (void) attribute_hidden;
/* Initialize `struct r_debug' if it has not already been done. The
argument is the run-time load address of the dynamic linker, to be put
@@ -775,9 +798,6 @@ extern void _dl_init_paths (const char *library_path) internal_function;
/* Gather the information needed to install the profiling tables and start
the timers. */
extern void _dl_start_profile (struct link_map *map, const char *output_dir)
- internal_function;
-extern void _dl_start_profile_internal (struct link_map *map,
- const char *output_dir)
internal_function attribute_hidden;
/* The actual functions used to keep book on the calls. */
@@ -813,8 +833,7 @@ extern const char *_dl_load_cache_lookup (const char *name)
all the time since this would create problems when the file is replaced.
Therefore we provide this function to close the file and open it again
once needed. */
-extern void _dl_unload_cache (void);
-extern void _dl_unload_cache_internal (void) attribute_hidden;
+extern void _dl_unload_cache (void) attribute_hidden;
/* System-dependent function to read a file's whole contents in the
most convenient manner available. *SIZEP gets the size of the
@@ -871,15 +890,20 @@ rtld_hidden_proto (_dl_allocate_tls_init)
extern void _dl_deallocate_tls (void *tcb, bool dealloc_tcb) internal_function;
rtld_hidden_proto (_dl_deallocate_tls)
-/* Return the symbol address given the map of the module it is in and
- the symbol record. */
-extern void *_dl_tls_symaddr (struct link_map *map, const ElfW(Sym) *ref)
- internal_function;
-
#if defined USE_TLS
extern void _dl_nothread_init_static_tls (struct link_map *) attribute_hidden;
#endif
+/* Find origin of the executable. */
+extern const char *_dl_get_origin (void) attribute_hidden;
+
+/* Count DSTs. */
+extern size_t _dl_dst_count (const char *name, int is_path) attribute_hidden;
+
+/* Substitute DST values. */
+extern char *_dl_dst_substitute (struct link_map *l, const char *name,
+ char *result, int is_path) attribute_hidden;
+
__END_DECLS
#endif /* ldsodefs.h */
diff --git a/sysdeps/generic/libc-start.c b/sysdeps/generic/libc-start.c
index 9edbf8e123..b92ab04fdb 100644
--- a/sysdeps/generic/libc-start.c
+++ b/sysdeps/generic/libc-start.c
@@ -174,7 +174,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
/* Call the initializer of the program, if any. */
#ifdef SHARED
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
- _dl_debug_printf ("\ninitialize program: %s\n\n", argv[0]);
+ GLRO(dl_debug_printf) ("\ninitialize program: %s\n\n", argv[0]);
#endif
if (init)
(*init) (
@@ -185,7 +185,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
#ifdef SHARED
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
- _dl_debug_printf ("\ntransferring control: %s\n\n", argv[0]);
+ GLRO(dl_debug_printf) ("\ntransferring control: %s\n\n", argv[0]);
#endif
#ifdef HAVE_CLEANUP_JMP_BUF