]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
On shared object unload, in __cxa_finalize, call and clear all installed
authorkib <kib@FreeBSD.org>
Mon, 23 Aug 2010 15:38:02 +0000 (15:38 +0000)
committerkib <kib@FreeBSD.org>
Mon, 23 Aug 2010 15:38:02 +0000 (15:38 +0000)
commitdf9bc4850f3a6aef289d53c0c3d1fc78d63bdda2
tree509be3ad57df8011e952d3da4691f43abd346d2e
parent7ca1c6f40abcb8550b7bbf0c67ceb3a73d93b342
On shared object unload, in __cxa_finalize, call and clear all installed
atexit and __cxa_atexit handlers that are either installed by unloaded
dso, or points to the functions provided by the dso.

Use _rtld_addr_phdr to locate segment information from the address of
private variable belonging to the dso, supplied by crtstuff.c. Provide
utility function __elf_phdr_match_addr to do the match of address against
dso executable segment.

Call back into libthr from __cxa_finalize using weak
__pthread_cxa_finalize symbol to remove any atfork handler which
function points into unloaded object.

The rtld needs private __pthread_cxa_finalize symbol to not require
resolution of the weak undefined symbol at initialization time. This
cannot work, since rtld is relocated before sym_zero is set up.

Idea by: kan
Reviewed by: kan (previous version)
MFC after: 3 weeks
lib/libc/gen/Makefile.inc
lib/libc/gen/Symbol.map
lib/libc/gen/elf_utils.c [new file with mode: 0644]
lib/libc/include/libc_private.h
lib/libc/stdlib/atexit.c
lib/libthr/pthread.map
lib/libthr/thread/thr_fork.c
lib/libthr/thread/thr_private.h
libexec/rtld-elf/rtld.c