fix inconsistent visibility for internal __tls_get_new function
authorRich Felker <dalias@aerifal.cx>
Tue, 14 Apr 2015 14:42:44 +0000 (10:42 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 14 Apr 2015 14:42:44 +0000 (10:42 -0400)
at the point of call it was declared hidden, but the definition was
not hidden. for some toolchains this inconsistency produced textrels
without ld-time binding.

src/ldso/dynlink.c
src/thread/__tls_get_addr.c

index 46183ce7bafee2a45f84a0c80eccdc9b65c70708..0151f74d248d2eb8ecfbda4ff6b74b57aee845b1 100644 (file)
@@ -1051,6 +1051,7 @@ void *__copy_tls(unsigned char *mem)
        return td;
 }
 
+__attribute__((__visibility__("hidden")))
 void *__tls_get_new(size_t *v)
 {
        pthread_t self = __pthread_self();
index 28ec7f02cb5f254fe6728052a57f453df4614f02..36333967bee9b237d5a006bf435d8a2976ba30f0 100644 (file)
@@ -1,13 +1,12 @@
 #include <stddef.h>
 #include "pthread_impl.h"
-#include "libc.h"
-
-void *__tls_get_new(size_t *) ATTR_LIBC_VISIBILITY;
 
 void *__tls_get_addr(size_t *v)
 {
        pthread_t self = __pthread_self();
 #ifdef SHARED
+       __attribute__((__visibility__("hidden")))
+       void *__tls_get_new(size_t *);
        if (v[0]<=(size_t)self->dtv[0])
                return (char *)self->dtv[v[0]]+v[1];
        return __tls_get_new(v);