diff options
author | Florian Weimer <fweimer@redhat.com> | 2016-11-30 15:59:57 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2016-11-30 15:59:57 +0100 |
commit | 9e78f6f6e7134a5f299cc8de77370218f8019237 (patch) | |
tree | 04aa339daf9901b8fc1851353c697528659e7afe /elf/rtld.c | |
parent | 705a79f82560ff6472cebed86aa5db04cdea3bce (diff) | |
download | glibc-9e78f6f6e7134a5f299cc8de77370218f8019237.tar.gz glibc-9e78f6f6e7134a5f299cc8de77370218f8019237.tar.xz glibc-9e78f6f6e7134a5f299cc8de77370218f8019237.zip |
Implement _dl_catch_error, _dl_signal_error in libc.so [BZ #16628]
This change moves the main implementation of _dl_catch_error, _dl_signal_error to libc.so, where TLS variables can be used directly. This removes a writable function pointer from the rtld_global variable. For use during initial relocation, minimal implementations of these functions are provided in ld.so. These are eventually interposed by the libc.so implementations. This is implemented by compiling elf/dl-error-skeleton.c twice, via elf/dl-error.c and elf/dl-error-minimal.c. As a side effect of this change, the static version of dl-error.c no longer includes support for the _dl_signal_cerror/_dl_receive_error mechanism because it is only used in ld.so.
Diffstat (limited to 'elf/rtld.c')
-rw-r--r-- | elf/rtld.c | 19 |
1 files changed, 0 insertions, 19 deletions
diff --git a/elf/rtld.c b/elf/rtld.c index 647661ca45..4ec25d7c30 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -167,8 +167,6 @@ struct rtld_global_ro _rtld_global_ro attribute_relro = /* Function pointers. */ ._dl_debug_printf = _dl_debug_printf, - ._dl_catch_error = _dl_catch_error, - ._dl_signal_error = _dl_signal_error, ._dl_mcount = _dl_mcount, ._dl_lookup_symbol_x = _dl_lookup_symbol_x, ._dl_check_caller = _dl_check_caller, @@ -637,18 +635,6 @@ cannot allocate TLS data structures for initial thread"); return tcbp; } -#ifdef _LIBC_REENTRANT -/* _dl_error_catch_tsd points to this for the single-threaded case. - It's reset by the thread library for multithreaded programs. */ -void ** __attribute__ ((const)) -_dl_initial_error_catch_tsd (void) -{ - static void *data; - return &data; -} -#endif - - static unsigned int do_preload (const char *fname, struct link_map *main_map, const char *where) { @@ -752,11 +738,6 @@ dl_main (const ElfW(Phdr) *phdr, #endif void *tcbp = NULL; -#ifdef _LIBC_REENTRANT - /* Explicit initialization since the reloc would just be more work. */ - GL(dl_error_catch_tsd) = &_dl_initial_error_catch_tsd; -#endif - GL(dl_init_static_tls) = &_dl_nothread_init_static_tls; #if defined SHARED && defined _LIBC_REENTRANT \ |