diff options
author | davidxu <davidxu@FreeBSD.org> | 2005-03-21 13:17:16 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2005-03-21 13:17:16 +0000 |
commit | 014dff15cfc2454a45cc1a52b1ba39a1a30ee042 (patch) | |
tree | 50917ddb1e6aab4a8e6a4cdaa5f2948827d0aa00 /lib/libc/gen/tls.c | |
parent | e023a7de704760d22e3c6a6dc8139788f8ebac72 (diff) | |
download | FreeBSD-src-014dff15cfc2454a45cc1a52b1ba39a1a30ee042.zip FreeBSD-src-014dff15cfc2454a45cc1a52b1ba39a1a30ee042.tar.gz |
Use __weak_reference macro to define weak symbols.
Diffstat (limited to 'lib/libc/gen/tls.c')
-rw-r--r-- | lib/libc/gen/tls.c | 82 |
1 files changed, 51 insertions, 31 deletions
diff --git a/lib/libc/gen/tls.c b/lib/libc/gen/tls.c index a005b5c..033c737 100644 --- a/lib/libc/gen/tls.c +++ b/lib/libc/gen/tls.c @@ -32,14 +32,34 @@ * runtime from ld-elf.so.1. */ +#include <sys/cdefs.h> #include <stdlib.h> #include <string.h> #include <elf.h> #include <assert.h> + #include "libc_private.h" /* XXX not sure what variants to use for arm. */ +__weak_reference(__libc_allocate_tls, _rtld_allocate_tls); +__weak_reference(__libc_free_tls, _rtld_free_tls); + +#ifdef __i386__ + +__weak_reference(___libc_tls_get_addr, ___tls_get_addr); +__attribute__((__regparm__(1))) void * ___libc_tls_get_addr(void *); + +#endif + +void * __libc_tls_get_addr(void *); +__weak_reference(__libc_tls_get_addr, __tls_get_addr); + +void *_rtld_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign); +void _rtld_free_tls(void *tls, size_t tcbsize, size_t tcbalign); +void *__libc_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign); +void __libc_free_tls(void *tls, size_t tcbsize, size_t tcbalign); + #if defined(__ia64__) || defined(__alpha__) || defined(__powerpc__) #define TLS_VARIANT_I #endif @@ -59,57 +79,50 @@ static size_t tls_init_size; static size_t tls_init_offset; #endif static void *tls_init; - -void _rtld_free_tls(void *tcb, size_t tcbsize, size_t tcbalign); #endif #ifdef __i386__ -extern void *___tls_get_addr(void *ti) __attribute__((__regparm__(1))); +/* GNU ABI */ -#pragma weak ___tls_get_addr __attribute__((__regparm__(1))) void * -___tls_get_addr(void *ti) +___libc_tls_get_addr(void *ti __unused) { return (0); } #endif -#pragma weak __tls_get_addr void * -__tls_get_addr() +__libc_tls_get_addr(void *ti __unused) { return (0); } +#ifndef PIC + #ifdef TLS_VARIANT_I -#pragma weak _rtld_free_tls /* * Free Static TLS using the Variant I method. */ void -_rtld_free_tls(void *tls, size_t tcbsize, size_t tcbalign) +__libc_free_tls(void *tls, size_t tcbsize __unused, size_t tcbalign __unused) { -#ifndef PIC Elf_Addr* dtv; dtv = ((Elf_Addr**)tls)[0]; free(tls); free(dtv); -#endif } -#pragma weak _rtld_allocate_tls /* * Allocate Static TLS using the Variant I method. */ void * -_rtld_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign) +__libc_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign __unused) { -#ifndef PIC size_t size; char *tls; Elf_Addr *dtv; @@ -121,7 +134,7 @@ _rtld_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign) tls = malloc(size); dtv = malloc(3 * sizeof(Elf_Addr)); - *(Elf_Addr**) tls = dtv; + *(Elf_Addr **) tls = dtv; dtv[0] = 1; dtv[1] = 1; @@ -131,14 +144,14 @@ _rtld_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign) * Copy the static TLS block over whole. */ memcpy(tls + tls_init_offset, - (char*) oldtls + tls_init_offset, + (char *)oldtls + tls_init_offset, tls_static_space - tls_init_offset); /* * We assume that this block was the one we created with * allocate_initial_tls(). */ - _rtld_free_tls(oldtls, 2*sizeof(Elf_Addr), sizeof(Elf_Addr)); + _rtld_free_tls(oldtls, 2 * sizeof(Elf_Addr), sizeof(Elf_Addr)); } else { memcpy(tls + tls_init_offset, tls_init, tls_init_size); memset(tls + tls_init_offset + tls_init_size, @@ -146,9 +159,6 @@ _rtld_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign) } return tls; -#else - return (0); -#endif } #endif @@ -158,11 +168,9 @@ _rtld_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign) /* * Free Static TLS using the Variant II method. */ -#pragma weak _rtld_free_tls void -_rtld_free_tls(void *tcb, size_t tcbsize, size_t tcbalign) +__libc_free_tls(void *tcb, size_t tcbsize __unused, size_t tcbalign) { -#ifndef PIC size_t size; Elf_Addr* dtv; Elf_Addr tlsstart, tlsend; @@ -178,17 +186,14 @@ _rtld_free_tls(void *tcb, size_t tcbsize, size_t tcbalign) tlsstart = tlsend - size; free((void*) tlsstart); free(dtv); -#endif } -#pragma weak _rtld_allocate_tls /* * Allocate Static TLS using the Variant II method. */ void * -_rtld_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign) +__libc_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign) { -#ifndef PIC size_t size; char *tls; Elf_Addr *dtv; @@ -230,18 +235,33 @@ _rtld_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign) } return (void*) segbase; +} + +#endif /* TLS_VARIANT_II */ + #else + +void * +__libc_allocate_tls(void *oldtls __unused, size_t tcbsize __unused, + size_t tcbalign __unused) +{ return (0); -#endif } -#endif +void +__libc_free_tls(void *tcb __unused, size_t tcbsize __unused, + size_t tcbalign __unused) +{ +} + +#endif /* PIC */ + +extern char **environ; void _init_tls() { #ifndef PIC - extern char **environ; Elf_Addr *sp; Elf_Auxinfo *aux, *auxp; Elf_Phdr *phdr; @@ -273,7 +293,7 @@ _init_tls() if (phdr == 0 || phent != sizeof(Elf_Phdr) || phnum == 0) return; - for (i = 0; i < phnum; i++) { + for (i = 0; (unsigned) i < phnum; i++) { if (phdr[i].p_type == PT_TLS) { #ifdef TLS_VARIANT_I tls_static_space = round(2*sizeof(Elf_Addr), |