mirror of git://sourceware.org/git/glibc.git
* sysdeps/generic/utmp_file.c (UNLOCK_FILE): Clear alarm before
resetting handler, to avoid the possibility of a spurious SIGALRM delivered to the user's handler. Reported by Amit D. Chaudhary <amitc@brocade.com>, * misc/Makefile (CFLAGS-init-misc.c): Varaible removed. It served to set -fkeep-inline-functions, which is not needed for the current file. * sysdeps/generic/ldsodefs.h: Add attribute_hidden to *_internal decls. (_dl_setup_hash): Add attribute_hidden. (_dl_sysdep_start, _dl_sysdep_start_cleanup): Likewise. (_dl_sysdep_read_whole_file, _dl_dprintf): Likewise. (_dl_new_object, _dl_map_object_deps): Likewise. (_dl_map_object_deps_internal): Remove decl. * elf/rtld.c (__mempcpy, _exit): Redeclare locally as hidden. * sysdeps/i386/dl-machine.h [PI_STATIC_AND_HIDDEN && HAVE_VISIBILITY_ATTRIBUTE && HAVE_HIDDEN && !HAVE_BROKEN_VISIBILITY_ATTRIBUTE] (elf_machine_dynamic, elf_machine_load_address): Rewritten without asm, instead relying on the compiler to produce only GOTOFF variable refs.
This commit is contained in:
parent
d8a36a812d
commit
6ce3881de5
24
ChangeLog
24
ChangeLog
|
|
@ -1,3 +1,27 @@
|
||||||
|
2002-08-25 Roland McGrath <roland@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/generic/utmp_file.c (UNLOCK_FILE): Clear alarm before
|
||||||
|
resetting handler, to avoid the possibility of a spurious SIGALRM
|
||||||
|
delivered to the user's handler.
|
||||||
|
Reported by Amit D. Chaudhary <amitc@brocade.com>,
|
||||||
|
|
||||||
|
* misc/Makefile (CFLAGS-init-misc.c): Varaible removed. It served to
|
||||||
|
set -fkeep-inline-functions, which is not needed for the current file.
|
||||||
|
|
||||||
|
* sysdeps/generic/ldsodefs.h: Add attribute_hidden to *_internal decls.
|
||||||
|
(_dl_setup_hash): Add attribute_hidden.
|
||||||
|
(_dl_sysdep_start, _dl_sysdep_start_cleanup): Likewise.
|
||||||
|
(_dl_sysdep_read_whole_file, _dl_dprintf): Likewise.
|
||||||
|
(_dl_new_object, _dl_map_object_deps): Likewise.
|
||||||
|
(_dl_map_object_deps_internal): Remove decl.
|
||||||
|
* elf/rtld.c (__mempcpy, _exit): Redeclare locally as hidden.
|
||||||
|
|
||||||
|
* sysdeps/i386/dl-machine.h [PI_STATIC_AND_HIDDEN
|
||||||
|
&& HAVE_VISIBILITY_ATTRIBUTE && HAVE_HIDDEN
|
||||||
|
&& !HAVE_BROKEN_VISIBILITY_ATTRIBUTE]
|
||||||
|
(elf_machine_dynamic, elf_machine_load_address): Rewritten without asm,
|
||||||
|
instead relying on the compiler to produce only GOTOFF variable refs.
|
||||||
|
|
||||||
2002-08-25 Ulrich Drepper <drepper@redhat.com>
|
2002-08-25 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* elf/dl-load.c: Fix typo in comment. Add a few more __builtin_expect.
|
* elf/dl-load.c: Fix typo in comment. Add a few more __builtin_expect.
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,13 @@
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
/* Avoid PLT use for our local calls at startup. */
|
||||||
|
extern __typeof (__mempcpy) __mempcpy attribute_hidden;
|
||||||
|
|
||||||
|
/* GCC has mental blocks about _exit. */
|
||||||
|
extern __typeof (_exit) exit_internal asm ("_exit") attribute_hidden;
|
||||||
|
#define _exit exit_internal
|
||||||
|
|
||||||
/* Helper function to handle errors while resolving symbols. */
|
/* Helper function to handle errors while resolving symbols. */
|
||||||
static void print_unresolved (int errcode, const char *objname,
|
static void print_unresolved (int errcode, const char *objname,
|
||||||
const char *errsting);
|
const char *errsting);
|
||||||
|
|
|
||||||
|
|
@ -419,7 +419,8 @@ extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */
|
||||||
extern void _dl_debug_printf (const char *fmt, ...)
|
extern void _dl_debug_printf (const char *fmt, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||||
extern void _dl_debug_printf_internal (const char *fmt, ...)
|
extern void _dl_debug_printf_internal (const char *fmt, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
__attribute__ ((__format__ (__printf__, 1, 2)))
|
||||||
|
attribute_hidden;
|
||||||
|
|
||||||
/* Write message on the debug file descriptor. The parameters are
|
/* Write message on the debug file descriptor. The parameters are
|
||||||
interpreted as for a `printf' call. All the lines buf the first
|
interpreted as for a `printf' call. All the lines buf the first
|
||||||
|
|
@ -431,7 +432,8 @@ extern void _dl_debug_printf_c (const char *fmt, ...)
|
||||||
/* Write a message on the specified descriptor FD. The parameters are
|
/* Write a message on the specified descriptor FD. The parameters are
|
||||||
interpreted as for a `printf' call. */
|
interpreted as for a `printf' call. */
|
||||||
extern void _dl_dprintf (int fd, const char *fmt, ...)
|
extern void _dl_dprintf (int fd, const char *fmt, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 3)));
|
__attribute__ ((__format__ (__printf__, 2, 3)))
|
||||||
|
attribute_hidden;
|
||||||
|
|
||||||
/* Write a message on the specified descriptor standard output. The
|
/* Write a message on the specified descriptor standard output. The
|
||||||
parameters are interpreted as for a `printf' call. */
|
parameters are interpreted as for a `printf' call. */
|
||||||
|
|
@ -466,8 +468,7 @@ extern void _dl_signal_error (int errcode, const char *object,
|
||||||
extern void _dl_signal_error_internal (int errcode, const char *object,
|
extern void _dl_signal_error_internal (int errcode, const char *object,
|
||||||
const char *occurred,
|
const char *occurred,
|
||||||
const char *errstring)
|
const char *errstring)
|
||||||
internal_function
|
internal_function __attribute__ ((__noreturn__)) attribute_hidden;
|
||||||
__attribute__ ((__noreturn__));
|
|
||||||
|
|
||||||
/* Like _dl_signal_error, but may return when called in the context of
|
/* Like _dl_signal_error, but may return when called in the context of
|
||||||
_dl_receive_error. */
|
_dl_receive_error. */
|
||||||
|
|
@ -498,7 +499,7 @@ extern struct link_map *_dl_map_object_internal (struct link_map *loader,
|
||||||
int preloaded,
|
int preloaded,
|
||||||
int type, int trace_mode,
|
int type, int trace_mode,
|
||||||
int mode)
|
int mode)
|
||||||
internal_function;
|
internal_function attribute_hidden;
|
||||||
|
|
||||||
/* Call _dl_map_object on the dependencies of MAP, and set up
|
/* Call _dl_map_object on the dependencies of MAP, and set up
|
||||||
MAP->l_searchlist. PRELOADS points to a vector of NPRELOADS previously
|
MAP->l_searchlist. PRELOADS points to a vector of NPRELOADS previously
|
||||||
|
|
@ -513,10 +514,11 @@ extern void _dl_map_object_deps_internal (struct link_map *map,
|
||||||
struct link_map **preloads,
|
struct link_map **preloads,
|
||||||
unsigned int npreloads,
|
unsigned int npreloads,
|
||||||
int trace_mode, int open_mode)
|
int trace_mode, int open_mode)
|
||||||
internal_function;
|
internal_function attribute_hidden;
|
||||||
|
|
||||||
/* Cache the locations of MAP's hash table. */
|
/* Cache the locations of MAP's hash table. */
|
||||||
extern void _dl_setup_hash (struct link_map *map) internal_function;
|
extern void _dl_setup_hash (struct link_map *map)
|
||||||
|
internal_function attribute_hidden;
|
||||||
|
|
||||||
|
|
||||||
/* Search loaded objects' symbol tables for a definition of the symbol
|
/* Search loaded objects' symbol tables for a definition of the symbol
|
||||||
|
|
@ -537,9 +539,9 @@ extern lookup_t _dl_lookup_symbol (const char *undef,
|
||||||
extern lookup_t _dl_lookup_symbol_internal (const char *undef,
|
extern lookup_t _dl_lookup_symbol_internal (const char *undef,
|
||||||
struct link_map *undef_map,
|
struct link_map *undef_map,
|
||||||
const ElfW(Sym) **sym,
|
const ElfW(Sym) **sym,
|
||||||
struct r_scope_elem *symbol_scope[],
|
struct r_scope_elem *symbolscope[],
|
||||||
int type_class, int flags)
|
int type_class, int flags)
|
||||||
internal_function;
|
internal_function attribute_hidden;
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
|
@ -565,7 +567,7 @@ extern lookup_t _dl_lookup_versioned_symbol_internal (const char *undef,
|
||||||
const struct r_found_version *version,
|
const struct r_found_version *version,
|
||||||
int type_class,
|
int type_class,
|
||||||
int explicit)
|
int explicit)
|
||||||
internal_function;
|
internal_function attribute_hidden;
|
||||||
|
|
||||||
/* For handling RTLD_NEXT we must be able to skip shared objects. */
|
/* For handling RTLD_NEXT we must be able to skip shared objects. */
|
||||||
extern lookup_t _dl_lookup_symbol_skip (const char *undef,
|
extern lookup_t _dl_lookup_symbol_skip (const char *undef,
|
||||||
|
|
@ -593,7 +595,7 @@ extern ElfW(Addr) _dl_symbol_value (struct link_map *map, const char *name)
|
||||||
and enter it into the _dl_main_map list. */
|
and enter it into the _dl_main_map list. */
|
||||||
extern struct link_map *_dl_new_object (char *realname, const char *libname,
|
extern struct link_map *_dl_new_object (char *realname, const char *libname,
|
||||||
int type, struct link_map *loader)
|
int type, struct link_map *loader)
|
||||||
internal_function;
|
internal_function attribute_hidden;
|
||||||
|
|
||||||
/* Relocate the given object (if it hasn't already been).
|
/* Relocate the given object (if it hasn't already been).
|
||||||
SCOPE is passed to _dl_lookup_symbol in symbol lookups.
|
SCOPE is passed to _dl_lookup_symbol in symbol lookups.
|
||||||
|
|
@ -603,7 +605,8 @@ extern void _dl_relocate_object (struct link_map *map,
|
||||||
int lazy, int consider_profiling);
|
int lazy, int consider_profiling);
|
||||||
extern void _dl_relocate_object_internal (struct link_map *map,
|
extern void _dl_relocate_object_internal (struct link_map *map,
|
||||||
struct r_scope_elem *scope[],
|
struct r_scope_elem *scope[],
|
||||||
int lazy, int consider_profiling);
|
int lazy, int consider_profiling)
|
||||||
|
attribute_hidden;
|
||||||
|
|
||||||
/* Call _dl_signal_error with a message about an unhandled reloc type.
|
/* Call _dl_signal_error with a message about an unhandled reloc type.
|
||||||
TYPE is the result of ELFW(R_TYPE) (r_info), i.e. an R_<CPU>_* value.
|
TYPE is the result of ELFW(R_TYPE) (r_info), i.e. an R_<CPU>_* value.
|
||||||
|
|
@ -660,7 +663,7 @@ extern void _dl_start_profile (struct link_map *map, const char *output_dir)
|
||||||
internal_function;
|
internal_function;
|
||||||
extern void _dl_start_profile_internal (struct link_map *map,
|
extern void _dl_start_profile_internal (struct link_map *map,
|
||||||
const char *output_dir)
|
const char *output_dir)
|
||||||
internal_function;
|
internal_function attribute_hidden;
|
||||||
|
|
||||||
/* The actual functions used to keep book on the calls. */
|
/* The actual functions used to keep book on the calls. */
|
||||||
extern void _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc);
|
extern void _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc);
|
||||||
|
|
@ -696,14 +699,14 @@ extern const char *_dl_load_cache_lookup (const char *name)
|
||||||
Therefore we provide this function to close the file and open it again
|
Therefore we provide this function to close the file and open it again
|
||||||
once needed. */
|
once needed. */
|
||||||
extern void _dl_unload_cache (void);
|
extern void _dl_unload_cache (void);
|
||||||
extern void _dl_unload_cache_internal (void);
|
extern void _dl_unload_cache_internal (void) attribute_hidden;
|
||||||
|
|
||||||
/* System-dependent function to read a file's whole contents in the
|
/* System-dependent function to read a file's whole contents in the
|
||||||
most convenient manner available. *SIZEP gets the size of the
|
most convenient manner available. *SIZEP gets the size of the
|
||||||
file. On error MAP_FAILED is returned. */
|
file. On error MAP_FAILED is returned. */
|
||||||
extern void *_dl_sysdep_read_whole_file (const char *file, size_t *sizep,
|
extern void *_dl_sysdep_read_whole_file (const char *file, size_t *sizep,
|
||||||
int prot)
|
int prot)
|
||||||
internal_function;
|
internal_function attribute_hidden;
|
||||||
|
|
||||||
/* System-specific function to do initial startup for the dynamic linker.
|
/* System-specific function to do initial startup for the dynamic linker.
|
||||||
After this, file access calls and getenv must work. This is responsible
|
After this, file access calls and getenv must work. This is responsible
|
||||||
|
|
@ -712,10 +715,11 @@ extern void *_dl_sysdep_read_whole_file (const char *file, size_t *sizep,
|
||||||
extern ElfW(Addr) _dl_sysdep_start (void **start_argptr,
|
extern ElfW(Addr) _dl_sysdep_start (void **start_argptr,
|
||||||
void (*dl_main) (const ElfW(Phdr) *phdr,
|
void (*dl_main) (const ElfW(Phdr) *phdr,
|
||||||
ElfW(Word) phnum,
|
ElfW(Word) phnum,
|
||||||
ElfW(Addr) *user_entry));
|
ElfW(Addr) *user_entry))
|
||||||
|
attribute_hidden;
|
||||||
|
|
||||||
extern void _dl_sysdep_start_cleanup (void)
|
extern void _dl_sysdep_start_cleanup (void)
|
||||||
internal_function;
|
internal_function attribute_hidden;
|
||||||
|
|
||||||
|
|
||||||
/* Determine next available module ID. */
|
/* Determine next available module ID. */
|
||||||
|
|
|
||||||
|
|
@ -74,9 +74,16 @@ static void timeout_handler (int signum) {};
|
||||||
fl.l_type = F_UNLCK; \
|
fl.l_type = F_UNLCK; \
|
||||||
__fcntl ((fd), F_SETLKW, &fl); \
|
__fcntl ((fd), F_SETLKW, &fl); \
|
||||||
\
|
\
|
||||||
/* Reset the signal handler and alarm. */ \
|
/* Reset the signal handler and alarm. We must reset the alarm \
|
||||||
|
before resetting the handler so our alarm does not generate a \
|
||||||
|
spurious SIGALRM seen by the user. However, we cannot just set \
|
||||||
|
the user's old alarm before restoring the handler, because then \
|
||||||
|
it's possible our handler could catch the user alarm's SIGARLM \
|
||||||
|
and then the user would never see the signal he expected. */ \
|
||||||
|
alarm (0); \
|
||||||
__sigaction (SIGALRM, &old_action, NULL); \
|
__sigaction (SIGALRM, &old_action, NULL); \
|
||||||
alarm (old_timeout); \
|
if (old_timeout != 0) \
|
||||||
|
alarm (old_timeout); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,35 @@ elf_machine_matches_host (const Elf32_Ehdr *ehdr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if defined PI_STATIC_AND_HIDDEN \
|
||||||
|
&& defined HAVE_VISIBILITY_ATTRIBUTE && defined HAVE_HIDDEN \
|
||||||
|
&& !defined HAVE_BROKEN_VISIBILITY_ATTRIBUTE
|
||||||
|
|
||||||
|
/* Return the link-time address of _DYNAMIC. Conveniently, this is the
|
||||||
|
first element of the GOT, a special entry that is never relocated. */
|
||||||
|
static inline Elf32_Addr __attribute__ ((unused, const))
|
||||||
|
elf_machine_dynamic (void)
|
||||||
|
{
|
||||||
|
/* This produces a GOTOFF reloc that resolves to zero at link time, so in
|
||||||
|
fact just loads from the GOT register directly. By doing it without
|
||||||
|
an asm we can let the compiler choose any register. */
|
||||||
|
extern const Elf32_Addr _GLOBAL_OFFSET_TABLE_[] attribute_hidden;
|
||||||
|
return _GLOBAL_OFFSET_TABLE_[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the run-time load address of the shared object. */
|
||||||
|
static inline Elf32_Addr __attribute__ ((unused))
|
||||||
|
elf_machine_load_address (void)
|
||||||
|
{
|
||||||
|
/* Compute the difference between the runtime address of _DYNAMIC as seen
|
||||||
|
by a GOTOFF reference, and the link-time address found in the special
|
||||||
|
unrelocated first GOT entry. */
|
||||||
|
extern Elf32_Dyn bygotoff[] asm ("_DYNAMIC") attribute_hidden;
|
||||||
|
return (Elf32_Addr) &bygotoff - elf_machine_dynamic ();
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* Without .hidden support, we can't compile the code above. */
|
||||||
|
|
||||||
/* Return the link-time address of _DYNAMIC. Conveniently, this is the
|
/* Return the link-time address of _DYNAMIC. Conveniently, this is the
|
||||||
first element of the GOT. This must be inlined in a function which
|
first element of the GOT. This must be inlined in a function which
|
||||||
uses global data. */
|
uses global data. */
|
||||||
|
|
@ -60,6 +89,9 @@ elf_machine_load_address (void)
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if !defined PROF && !__BOUNDED_POINTERS__
|
#if !defined PROF && !__BOUNDED_POINTERS__
|
||||||
/* We add a declaration of this function here so that in dl-runtime.c
|
/* We add a declaration of this function here so that in dl-runtime.c
|
||||||
the ELF_MACHINE_RUNTIME_TRAMPOLINE macro really can pass the parameters
|
the ELF_MACHINE_RUNTIME_TRAMPOLINE macro really can pass the parameters
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue