diff options
-rw-r--r-- | ChangeLog | 55 | ||||
-rw-r--r-- | elf/Versions | 3 | ||||
-rw-r--r-- | sysdeps/generic/ldsodefs.h | 182 |
3 files changed, 160 insertions, 80 deletions
@@ -1,3 +1,58 @@ +2004-03-05 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/generic/ldsodefs.h: Define new structure rtld_global_ro. + Declare _rtld_global_ro and _rtld_local_ro. Move members of + rtld_global structure into the new one if they are modified only + at startup time. Define GLRO to access _rtld_global_ro. + * elf/Versions: Export _rtld_global_ro. + * elf/dl-close.c: Use GLRO instead of GL where appropriate. + * elf/dl-conflict.c: Likewise. + * elf/dl-deps.c: Likewise. + * elf/dl-dst.h: Likewise. + * elf/dl-error.c: Likewise. + * elf/dl-fini.c: Likewise. + * elf/dl-init.c: Likewise. + * elf/dl-load.c: Likewise. + * elf/dl-lookup.c: Likewise. + * elf/dl-minimal.c: Likewise. + * elf/dl-open.c: Likewise. + * elf/dl-profile.c: Likewise. + * elf/dl-reloc.c: Likewise. + * elf/dl-runtime.c: Likewise. + * elf/dl-support.c: Likewise. + * elf/dl-version.c: Likewise. + * elf/do-lookup.h: Likewise. + * elf/rtld.c: Likewise. + * sysdeps/generic/dl-cache.c: Likewise. + * sysdeps/generic/dl-origin.c: Likewise. + * sysdeps/generic/dl-sysdep.c: Likewise. + * sysdeps/generic/libc-start.c: Likewise. + * sysdeps/generic/dl-cache.c: Likewise. + * sysdeps/i386/dl-machine.h: Likewise. + * sysdeps/i386/setfpucw.c: Likewise. + * sysdeps/i386/fpu/fclrexcpt.c: Likewise. + * sysdeps/i386/fpu/fedisblexcpt.c: Likewise. + * sysdeps/i386/fpu/feenablxcpt.c: Likewise. + * sysdeps/i386/fpu/feholdexcpt.c: Likewise. + * sysdeps/i386/fpu/fesetround.c: Likewise. + * sysdeps/i386/fpu/fsetexcptflg.c: Likewise. + * sysdeps/i386/fpu/ftestexcept.c: Likewise. + * sysdeps/unix/sysv/linux/dl-execstat.c: Likewise. + * sysdeps/unix/sysv/linux/dl-librecon.h: Likewise. + * sysdeps/unix/sysv/linux/dl-origin.c: Likewise. + * sysdeps/unix/sysv/linux/dl-osinfo.h: Likewise. + * sysdeps/unix/sysv/linux/getclktck.c: Likewise. + * sysdeps/unix/sysv/linux/getpagesize.c: Likewise. + * sysdeps/unix/sysv/linux/init-first.c: Likewise. + * sysdeps/unix/sysv/linux/prof-freq.c: Likewise. + * sysdeps/unix/sysv/linux/i386/dl-librecon.h: Likewise. + * sysdeps/unix/sysv/linux/i386/sigaction.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext.S: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/getcontext.S: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S: Likewise. + * sysdeps/x86_64/dl-machine.h: Likewise. + 2004-03-04 Ulrich Drepper <drepper@redhat.com> * sysdeps/generic/ldsodefs.h: Don't define _dl_name_match_p as inline. diff --git a/elf/Versions b/elf/Versions index 21f8cdbd6f..709a657775 100644 --- a/elf/Versions +++ b/elf/Versions @@ -53,7 +53,8 @@ ld { _dl_map_object; _dl_map_object_deps; _dl_out_of_memory; _dl_relocate_object; _dl_signal_error; _dl_start_profile; _dl_starting_up; _dl_unload_cache; - _rtld_global; _dl_tls_symaddr; _dl_allocate_tls; _dl_deallocate_tls; + _rtld_global; _rtld_global_ro; + _dl_tls_symaddr; _dl_allocate_tls; _dl_deallocate_tls; _dl_get_tls_static_info; _dl_allocate_tls_init; _dl_get_origin; _dl_tls_setup; _dl_rtld_di_serinfo; _dl_make_stack_executable; diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index d7a6093b21..5d253e460a 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -220,23 +220,6 @@ struct rtld_global reset if in _dl_close if the last global object is removed. */ EXTERN size_t _dl_global_scope_alloc; - /* If nonzero the appropriate debug information is printed. */ - EXTERN int _dl_debug_mask; -#define DL_DEBUG_LIBS (1 << 0) -#define DL_DEBUG_IMPCALLS (1 << 1) -#define DL_DEBUG_BINDINGS (1 << 2) -#define DL_DEBUG_SYMBOLS (1 << 3) -#define DL_DEBUG_VERSIONS (1 << 4) -#define DL_DEBUG_RELOC (1 << 5) -#define DL_DEBUG_FILES (1 << 6) -#define DL_DEBUG_STATISTICS (1 << 7) -/* These two are used only internally. */ -#define DL_DEBUG_HELP (1 << 8) -#define DL_DEBUG_PRELINK (1 << 9) - - /* 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. @@ -246,12 +229,6 @@ struct rtld_global At this time it is not anymore a problem to modify the tables. */ __rtld_lock_define_recursive (EXTERN, _dl_load_lock) - /* OS version. */ - EXTERN unsigned int _dl_osversion; - /* Platform name. */ - EXTERN const char *_dl_platform; - EXTERN size_t _dl_platformlen; - /* Incremented whenever something may have been added to dl_loaded. */ EXTERN unsigned long long _dl_load_adds; @@ -260,25 +237,6 @@ struct rtld_global EXTERN int _dl_zerofd; #endif - /* CLK_TCK as reported by the kernel. */ - EXTERN int _dl_clktck; - - /* 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; @@ -290,36 +248,13 @@ struct rtld_global EXTERN hp_timing_t _dl_hp_timing_overhead; #endif - /* Name of the shared object to be profiled (if any). */ - EXTERN const char *_dl_profile; /* Map of shared object to be profiled. */ EXTERN struct link_map *_dl_profile_map; - /* Filename of the output file. */ - EXTERN const char *_dl_profile_output; - /* Map of shared object to be prelink traced. */ - EXTERN struct link_map *_dl_trace_prelink_map; - /* Name of the object we want to trace the prelinking. */ - EXTERN const char *_dl_trace_prelink; - - /* Expected cache ID. */ - EXTERN int _dl_correct_cache_id; /* Counters for the number of relocations performed. */ EXTERN unsigned long int _dl_num_relocations; EXTERN unsigned long int _dl_num_cache_relocations; - /* Mask for hardware capabilities that are available. */ - EXTERN unsigned long int _dl_hwcap; - - /* Mask for important hardware capabilities we honour. */ - EXTERN unsigned long int _dl_hwcap_mask; - - /* Names of shared object for which the RPATH should be ignored. */ - EXTERN const char *_dl_inhibit_rpath; - - /* Location of the binary. */ - EXTERN const char *_dl_origin_path; - /* List of search directories. */ EXTERN struct r_search_path_elem *_dl_all_dirs; EXTERN struct r_search_path_elem *_dl_init_all_dirs; @@ -327,11 +262,6 @@ struct rtld_global /* File descriptor to write debug messages to. */ EXTERN int _dl_debug_fd; - /* -1 if the dynamic linker should honor library load bias, - 0 if not, -2 use the default (honor biases for normal - binaries, don't honor for PIEs). */ - EXTERN ElfW(Addr) _dl_use_load_bias; - #ifdef _LIBC_REENTRANT EXTERN void **(*_dl_error_catch_tsd) (void) __attribute__ ((const)); #endif @@ -403,15 +333,6 @@ struct rtld_global EXTERN void (*_dl_init_static_tls) (struct link_map *); #endif -#ifdef NEED_DL_SYSINFO - /* Syscall handling improvements. This is very specific to x86. */ - EXTERN uintptr_t _dl_sysinfo; - - /* The vsyscall page is a virtual DSO pre-mapped by the kernel. - This points to its ELF header. */ - EXTERN const ElfW(Ehdr) *_dl_sysinfo_dso; -#endif - #ifdef SHARED }; # define __rtld_global_attribute__ @@ -432,6 +353,109 @@ extern struct rtld_global _rtld_local __rtld_local_attribute__; # endif extern struct rtld_global _rtld_global __rtld_global_attribute__; #endif + +#ifndef SHARED +# define GLRO(name) _##name +#else +# ifdef IS_IN_rtld +# define GLRO(name) _rtld_local_ro._##name +# else +# define GLRO(name) _rtld_global_ro._##name +# endif +struct rtld_global_ro +{ +#endif + + /* If nonzero the appropriate debug information is printed. */ + EXTERN int _dl_debug_mask; +#define DL_DEBUG_LIBS (1 << 0) +#define DL_DEBUG_IMPCALLS (1 << 1) +#define DL_DEBUG_BINDINGS (1 << 2) +#define DL_DEBUG_SYMBOLS (1 << 3) +#define DL_DEBUG_VERSIONS (1 << 4) +#define DL_DEBUG_RELOC (1 << 5) +#define DL_DEBUG_FILES (1 << 6) +#define DL_DEBUG_STATISTICS (1 << 7) +/* These two are used only internally. */ +#define DL_DEBUG_HELP (1 << 8) +#define DL_DEBUG_PRELINK (1 << 9) + + /* Cached value of `getpagesize ()'. */ + EXTERN size_t _dl_pagesize; + + /* OS version. */ + EXTERN unsigned int _dl_osversion; + /* Platform name. */ + EXTERN const char *_dl_platform; + EXTERN size_t _dl_platformlen; + + /* CLK_TCK as reported by the kernel. */ + EXTERN int _dl_clktck; + + /* 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; + + /* Expected cache ID. */ + EXTERN int _dl_correct_cache_id; + + /* Mask for hardware capabilities that are available. */ + EXTERN unsigned long int _dl_hwcap; + + /* Mask for important hardware capabilities we honour. */ + EXTERN unsigned long int _dl_hwcap_mask; + + /* Names of shared object for which the RPATH should be ignored. */ + EXTERN const char *_dl_inhibit_rpath; + + /* Location of the binary. */ + EXTERN const char *_dl_origin_path; + + /* -1 if the dynamic linker should honor library load bias, + 0 if not, -2 use the default (honor biases for normal + binaries, don't honor for PIEs). */ + EXTERN ElfW(Addr) _dl_use_load_bias; + + /* Name of the shared object to be profiled (if any). */ + EXTERN const char *_dl_profile; + /* Filename of the output file. */ + EXTERN const char *_dl_profile_output; + /* Name of the object we want to trace the prelinking. */ + EXTERN const char *_dl_trace_prelink; + /* Map of shared object to be prelink traced. */ + EXTERN struct link_map *_dl_trace_prelink_map; + +#ifdef NEED_DL_SYSINFO + /* Syscall handling improvements. This is very specific to x86. */ + EXTERN uintptr_t _dl_sysinfo; + + /* The vsyscall page is a virtual DSO pre-mapped by the kernel. + This points to its ELF header. */ + EXTERN const ElfW(Ehdr) *_dl_sysinfo_dso; +#endif + +#ifdef SHARED +}; +# 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__; +#endif #undef EXTERN #ifdef IS_IN_rtld |