about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/atomic_arch.h5
-rw-r--r--arch/arm/pthread_arch.h2
-rw-r--r--arch/mips/syscall_arch.h3
-rw-r--r--arch/mipsn32/syscall_arch.h3
-rw-r--r--arch/sh/atomic_arch.h4
-rw-r--r--crt/crt1.c5
-rw-r--r--crt/rcrt1.c7
-rw-r--r--ldso/dlstart.c6
-rw-r--r--ldso/dynlink.c30
-rw-r--r--src/env/__init_tls.c3
-rw-r--r--src/env/__libc_start_main.c3
-rw-r--r--src/env/__stack_chk_fail.c3
-rw-r--r--src/exit/abort.c3
-rw-r--r--src/exit/exit.c3
-rw-r--r--src/internal/fdpic_crt.h4
-rw-r--r--src/internal/libc.h23
-rw-r--r--src/internal/malloc_impl.h8
-rw-r--r--src/internal/sh/__shcall.c5
-rw-r--r--src/internal/syscall.h4
-rw-r--r--src/internal/version.c4
-rw-r--r--src/ldso/__dlsym.c3
-rw-r--r--src/ldso/dl_iterate_phdr.c3
-rw-r--r--src/ldso/dlclose.c4
-rw-r--r--src/ldso/dlerror.c9
-rw-r--r--src/ldso/dlinfo.c7
-rw-r--r--src/ldso/dlopen.c3
-rw-r--r--src/ldso/tlsdesc.c3
-rw-r--r--src/multibyte/internal.h6
-rw-r--r--src/signal/sigaction.c3
-rw-r--r--src/signal/sigsetjmp_tail.c4
-rw-r--r--src/thread/__syscall_cp.c4
-rw-r--r--src/thread/__tls_get_addr.c3
-rw-r--r--src/thread/arm/__set_thread_area.c5
-rw-r--r--src/thread/pthread_attr_setinheritsched.c4
-rw-r--r--src/thread/pthread_cancel.c6
-rw-r--r--src/thread/sh/__set_thread_area.c9
-rw-r--r--src/thread/sh/__unmapself.c2
-rw-r--r--src/thread/x32/syscall_cp_fixup.c13
38 files changed, 94 insertions, 125 deletions
diff --git a/arch/arm/atomic_arch.h b/arch/arm/atomic_arch.h
index 62458b45..e427836a 100644
--- a/arch/arm/atomic_arch.h
+++ b/arch/arm/atomic_arch.h
@@ -1,11 +1,12 @@
+#include "libc.h"
+
 #if __ARM_ARCH_4__ || __ARM_ARCH_4T__ || __ARM_ARCH == 4
 #define BLX "mov lr,pc\n\tbx"
 #else
 #define BLX "blx"
 #endif
 
-extern uintptr_t __attribute__((__visibility__("hidden")))
-	__a_cas_ptr, __a_barrier_ptr;
+extern hidden uintptr_t __a_cas_ptr, __a_barrier_ptr;
 
 #if ((__ARM_ARCH_6__ || __ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
  || __ARM_ARCH_6T2__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
diff --git a/arch/arm/pthread_arch.h b/arch/arm/pthread_arch.h
index 8f2ae8f8..5c6aff28 100644
--- a/arch/arm/pthread_arch.h
+++ b/arch/arm/pthread_arch.h
@@ -18,7 +18,7 @@ static inline pthread_t __pthread_self()
 
 static inline pthread_t __pthread_self()
 {
-	extern uintptr_t __attribute__((__visibility__("hidden"))) __a_gettp_ptr;
+	extern hidden uintptr_t __a_gettp_ptr;
 	register uintptr_t p __asm__("r0");
 	__asm__ __volatile__ ( BLX " %1" : "=r"(p) : "r"(__a_gettp_ptr) : "cc", "lr" );
 	return (void *)(p-sizeof(struct pthread));
diff --git a/arch/mips/syscall_arch.h b/arch/mips/syscall_arch.h
index 666f413f..01de67b8 100644
--- a/arch/mips/syscall_arch.h
+++ b/arch/mips/syscall_arch.h
@@ -3,8 +3,7 @@
 ((union { long long ll; long l[2]; }){ .ll = x }).l[1]
 #define __SYSCALL_LL_O(x) 0, __SYSCALL_LL_E((x))
 
-__attribute__((visibility("hidden")))
-long (__syscall)(long, ...);
+hidden long (__syscall)(long, ...);
 
 #define SYSCALL_RLIM_INFINITY (-1UL/2)
 
diff --git a/arch/mipsn32/syscall_arch.h b/arch/mipsn32/syscall_arch.h
index 93a026f6..f6a1fbae 100644
--- a/arch/mipsn32/syscall_arch.h
+++ b/arch/mipsn32/syscall_arch.h
@@ -1,8 +1,7 @@
 #define __SYSCALL_LL_E(x) (x)
 #define __SYSCALL_LL_O(x) (x)
 
-__attribute__((visibility("hidden")))
-long (__syscall)(long, ...);
+hidden long (__syscall)(long, ...);
 
 #define SYSCALL_RLIM_INFINITY (-1UL/2)
 
diff --git a/arch/sh/atomic_arch.h b/arch/sh/atomic_arch.h
index d48a7651..0a4d0c11 100644
--- a/arch/sh/atomic_arch.h
+++ b/arch/sh/atomic_arch.h
@@ -1,3 +1,5 @@
+#include "libc.h"
+
 #if defined(__SH4A__)
 
 #define a_ll a_ll
@@ -30,7 +32,7 @@ static inline void a_barrier()
 #else
 
 #define a_cas a_cas
-__attribute__((__visibility__("hidden"))) extern const void *__sh_cas_ptr;
+extern hidden const void *__sh_cas_ptr;
 static inline int a_cas(volatile int *p, int t, int s)
 {
 	register int r1 __asm__("r1");
diff --git a/crt/crt1.c b/crt/crt1.c
index af02af94..7b12665f 100644
--- a/crt/crt1.c
+++ b/crt/crt1.c
@@ -1,12 +1,13 @@
 #include <features.h>
+#include "libc.h"
 
 #define START "_start"
 
 #include "crt_arch.h"
 
 int main();
-void _init() __attribute__((weak));
-void _fini() __attribute__((weak));
+weak void _init();
+weak void _fini();
 _Noreturn int __libc_start_main(int (*)(), int, char **,
 	void (*)(), void(*)(), void(*)());
 
diff --git a/crt/rcrt1.c b/crt/rcrt1.c
index be017153..7bb3322f 100644
--- a/crt/rcrt1.c
+++ b/crt/rcrt1.c
@@ -3,13 +3,12 @@
 #include "../ldso/dlstart.c"
 
 int main();
-void _init() __attribute__((weak));
-void _fini() __attribute__((weak));
+weak void _init();
+weak void _fini();
 _Noreturn int __libc_start_main(int (*)(), int, char **,
 	void (*)(), void(*)(), void(*)());
 
-__attribute__((__visibility__("hidden")))
-_Noreturn void __dls2(unsigned char *base, size_t *sp)
+hidden _Noreturn void __dls2(unsigned char *base, size_t *sp)
 {
 	__libc_start_main(main, *sp, (void *)(sp+1), _init, _fini, 0);
 }
diff --git a/ldso/dlstart.c b/ldso/dlstart.c
index 4dbe1784..20d50f2c 100644
--- a/ldso/dlstart.c
+++ b/ldso/dlstart.c
@@ -1,5 +1,6 @@
 #include <stddef.h>
 #include "dynlink.h"
+#include "libc.h"
 
 #ifndef START
 #define START "_dlstart"
@@ -11,14 +12,13 @@
 
 #ifndef GETFUNCSYM
 #define GETFUNCSYM(fp, sym, got) do { \
-	__attribute__((__visibility__("hidden"))) void sym(); \
+	hidden void sym(); \
 	static void (*static_func_ptr)() = sym; \
 	__asm__ __volatile__ ( "" : "+m"(static_func_ptr) : : "memory"); \
 	*(fp) = static_func_ptr; } while(0)
 #endif
 
-__attribute__((__visibility__("hidden")))
-void _dlstart_c(size_t *sp, size_t *dynv)
+hidden void _dlstart_c(size_t *sp, size_t *dynv)
 {
 	size_t i, aux[AUX_CNT], dyn[DYN_CNT];
 	size_t *rel, rel_size, base;
diff --git a/ldso/dynlink.c b/ldso/dynlink.c
index 87281ddb..b46cbafb 100644
--- a/ldso/dynlink.c
+++ b/ldso/dynlink.c
@@ -99,8 +99,7 @@ int __init_tp(void *);
 void __init_libc(char **, char *);
 void *__copy_tls(unsigned char *);
 
-__attribute__((__visibility__("hidden")))
-const char *__libc_get_version(void);
+hidden const char *__libc_get_version(void);
 
 static struct builtin_tls {
 	char c;
@@ -133,14 +132,11 @@ static struct dso *const nodeps_dummy;
 
 struct debug *_dl_debug_addr = &debug;
 
-__attribute__((__visibility__("hidden")))
-extern int __malloc_replaced;
+extern hidden int __malloc_replaced;
 
-__attribute__((__visibility__("hidden")))
-void (*const __init_array_start)(void)=0, (*const __fini_array_start)(void)=0;
+hidden void (*const __init_array_start)(void)=0, (*const __fini_array_start)(void)=0;
 
-__attribute__((__visibility__("hidden")))
-extern void (*const __init_array_end)(void), (*const __fini_array_end)(void);
+extern hidden void (*const __init_array_end)(void), (*const __fini_array_end)(void);
 
 weak_alias(__init_array_start, __init_array_end);
 weak_alias(__fini_array_start, __fini_array_end);
@@ -306,8 +302,7 @@ static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
 	return def;
 }
 
-__attribute__((__visibility__("hidden")))
-ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic();
+hidden ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic();
 
 static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stride)
 {
@@ -1332,8 +1327,7 @@ void __init_tls(size_t *auxv)
 {
 }
 
-__attribute__((__visibility__("hidden")))
-void *__tls_get_new(tls_mod_off_t *v)
+hidden void *__tls_get_new(tls_mod_off_t *v)
 {
 	pthread_t self = __pthread_self();
 
@@ -1401,8 +1395,7 @@ static void update_tls_size()
  * linker itself, but some of the relocations performed may need to be
  * replaced later due to copy relocations in the main program. */
 
-__attribute__((__visibility__("hidden")))
-void __dls2(unsigned char *base, size_t *sp)
+hidden void __dls2(unsigned char *base, size_t *sp)
 {
 	if (DL_FDPIC) {
 		void *p1 = (void *)sp[-2];
@@ -1860,8 +1853,7 @@ end:
 	return p;
 }
 
-__attribute__((__visibility__("hidden")))
-int __dl_invalid_handle(void *h)
+hidden int __dl_invalid_handle(void *h)
 {
 	struct dso *p;
 	for (p=head; p; p=p->next) if (h==p) return 0;
@@ -2027,8 +2019,7 @@ int dladdr(const void *addr_arg, Dl_info *info)
 	return 1;
 }
 
-__attribute__((__visibility__("hidden")))
-void *__dlsym(void *restrict p, const char *restrict s, void *restrict ra)
+hidden void *__dlsym(void *restrict p, const char *restrict s, void *restrict ra)
 {
 	void *res;
 	pthread_rwlock_rdlock(&lock);
@@ -2063,8 +2054,7 @@ int dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void
 	return ret;
 }
 
-__attribute__((__visibility__("hidden")))
-void __dl_vseterr(const char *, va_list);
+hidden void __dl_vseterr(const char *, va_list);
 
 static void error(const char *fmt, ...)
 {
diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c
index 31d324a8..e0224243 100644
--- a/src/env/__init_tls.c
+++ b/src/env/__init_tls.c
@@ -72,8 +72,7 @@ typedef Elf32_Phdr Phdr;
 typedef Elf64_Phdr Phdr;
 #endif
 
-__attribute__((__weak__, __visibility__("hidden")))
-extern const size_t _DYNAMIC[];
+extern weak hidden const size_t _DYNAMIC[];
 
 static void static_init_tls(size_t *aux)
 {
diff --git a/src/env/__libc_start_main.c b/src/env/__libc_start_main.c
index 0583f686..c1b06697 100644
--- a/src/env/__libc_start_main.c
+++ b/src/env/__libc_start_main.c
@@ -11,8 +11,7 @@ void __init_tls(size_t *);
 static void dummy(void) {}
 weak_alias(dummy, _init);
 
-__attribute__((__weak__, __visibility__("hidden")))
-extern void (*const __init_array_start)(void), (*const __init_array_end)(void);
+extern weak hidden void (*const __init_array_start)(void), (*const __init_array_end)(void);
 
 static void dummy1(void *p) {}
 weak_alias(dummy1, __init_ssp);
diff --git a/src/env/__stack_chk_fail.c b/src/env/__stack_chk_fail.c
index 4de82fd9..e32596d1 100644
--- a/src/env/__stack_chk_fail.c
+++ b/src/env/__stack_chk_fail.c
@@ -17,7 +17,6 @@ void __stack_chk_fail(void)
 	a_crash();
 }
 
-__attribute__((__visibility__("hidden")))
-void __stack_chk_fail_local(void);
+hidden void __stack_chk_fail_local(void);
 
 weak_alias(__stack_chk_fail, __stack_chk_fail_local);
diff --git a/src/exit/abort.c b/src/exit/abort.c
index d6bd546b..7c323d26 100644
--- a/src/exit/abort.c
+++ b/src/exit/abort.c
@@ -6,8 +6,7 @@
 #include "libc.h"
 #include "ksigaction.h"
 
-__attribute__((__visibility__("hidden")))
-volatile int __abort_lock[1];
+hidden volatile int __abort_lock[1];
 
 _Noreturn void abort(void)
 {
diff --git a/src/exit/exit.c b/src/exit/exit.c
index bf7835a1..a6869b37 100644
--- a/src/exit/exit.c
+++ b/src/exit/exit.c
@@ -12,8 +12,7 @@ weak_alias(dummy, __funcs_on_exit);
 weak_alias(dummy, __stdio_exit);
 weak_alias(dummy, _fini);
 
-__attribute__((__weak__, __visibility__("hidden")))
-extern void (*const __fini_array_start)(void), (*const __fini_array_end)(void);
+extern weak hidden void (*const __fini_array_start)(void), (*const __fini_array_end)(void);
 
 static void libc_exit_fini(void)
 {
diff --git a/src/internal/fdpic_crt.h b/src/internal/fdpic_crt.h
index 7eb50c6b..3c3f077d 100644
--- a/src/internal/fdpic_crt.h
+++ b/src/internal/fdpic_crt.h
@@ -1,7 +1,7 @@
 #include <stdint.h>
+#include "libc.h"
 
-__attribute__((__visibility__("hidden")))
-void *__fdpic_fixup(void *map, uintptr_t *a, uintptr_t *z)
+hidden void *__fdpic_fixup(void *map, uintptr_t *a, uintptr_t *z)
 {
 	/* If map is a null pointer, the program was loaded by a
 	 * non-FDPIC-aware ELF loader, and fixups are not needed,
diff --git a/src/internal/libc.h b/src/internal/libc.h
index 5e145183..7307a738 100644
--- a/src/internal/libc.h
+++ b/src/internal/libc.h
@@ -33,24 +33,21 @@ struct __libc {
 #define PAGE_SIZE libc.page_size
 #endif
 
-#ifdef __PIC__
-#define ATTR_LIBC_VISIBILITY __attribute__((visibility("hidden")))
-#else
-#define ATTR_LIBC_VISIBILITY
-#endif
+#define weak __attribute__((__weak__))
+#define hidden __attribute__((__visibility__("hidden")))
 
-extern struct __libc __libc ATTR_LIBC_VISIBILITY;
+extern hidden struct __libc __libc;
 #define libc __libc
 
-extern size_t __hwcap ATTR_LIBC_VISIBILITY;
-extern size_t __sysinfo ATTR_LIBC_VISIBILITY;
+extern hidden size_t __hwcap;
+extern hidden size_t __sysinfo;
 extern char *__progname, *__progname_full;
 
 /* Designed to avoid any overhead in non-threaded processes */
-void __lock(volatile int *) ATTR_LIBC_VISIBILITY;
-void __unlock(volatile int *) ATTR_LIBC_VISIBILITY;
-int __lockfile(FILE *) ATTR_LIBC_VISIBILITY;
-void __unlockfile(FILE *) ATTR_LIBC_VISIBILITY;
+hidden void __lock(volatile int *);
+hidden void __unlock(volatile int *);
+hidden int __lockfile(FILE *);
+hidden void __unlockfile(FILE *);
 #define LOCK(x) __lock(x)
 #define UNLOCK(x) __unlock(x)
 
@@ -61,7 +58,7 @@ extern char **__environ;
 
 #undef weak_alias
 #define weak_alias(old, new) \
-	extern __typeof(old) new __attribute__((weak, alias(#old)))
+	extern __typeof(old) new __attribute__((__weak__, __alias__(#old)))
 
 #undef LFS64_2
 #define LFS64_2(x, y) weak_alias(x, y)
diff --git a/src/internal/malloc_impl.h b/src/internal/malloc_impl.h
index 5d025b06..4355d84c 100644
--- a/src/internal/malloc_impl.h
+++ b/src/internal/malloc_impl.h
@@ -1,6 +1,8 @@
 #ifndef MALLOC_IMPL_H
 #define MALLOC_IMPL_H
 
+#include "libc.h"
+
 void *__mmap(void *, size_t, int, int, int, off_t);
 int __munmap(void *, size_t);
 void *__mremap(void *, size_t, size_t, int, ...);
@@ -36,10 +38,8 @@ struct bin {
 
 #define IS_MMAPPED(c) !((c)->csize & (C_INUSE))
 
-__attribute__((__visibility__("hidden")))
-void __bin_chunk(struct chunk *);
+hidden void __bin_chunk(struct chunk *);
 
-__attribute__((__visibility__("hidden")))
-extern int __malloc_replaced;
+hidden extern int __malloc_replaced;
 
 #endif
diff --git a/src/internal/sh/__shcall.c b/src/internal/sh/__shcall.c
index dfe80a7f..23655904 100644
--- a/src/internal/sh/__shcall.c
+++ b/src/internal/sh/__shcall.c
@@ -1,5 +1,6 @@
-__attribute__((__visibility__("hidden")))
-int __shcall(void *arg, int (*func)(void *))
+#include "libc.h"
+
+hidden int __shcall(void *arg, int (*func)(void *))
 {
 	return func(arg);
 }
diff --git a/src/internal/syscall.h b/src/internal/syscall.h
index 6d378a81..c12a46cd 100644
--- a/src/internal/syscall.h
+++ b/src/internal/syscall.h
@@ -2,6 +2,7 @@
 #define _INTERNAL_SYSCALL_H
 
 #include <sys/syscall.h>
+#include "libc.h"
 #include "syscall_arch.h"
 
 #ifndef SYSCALL_RLIM_INFINITY
@@ -21,8 +22,7 @@
 typedef long syscall_arg_t;
 #endif
 
-__attribute__((visibility("hidden")))
-long __syscall_ret(unsigned long), __syscall(syscall_arg_t, ...),
+hidden long __syscall_ret(unsigned long), __syscall(syscall_arg_t, ...),
 	__syscall_cp(syscall_arg_t, syscall_arg_t, syscall_arg_t, syscall_arg_t,
 	             syscall_arg_t, syscall_arg_t, syscall_arg_t);
 
diff --git a/src/internal/version.c b/src/internal/version.c
index dc044ec4..0d6e1f82 100644
--- a/src/internal/version.c
+++ b/src/internal/version.c
@@ -1,9 +1,9 @@
 #include "version.h"
+#include "libc.h"
 
 static const char version[] = VERSION;
 
-__attribute__((__visibility__("hidden")))
-const char *__libc_get_version()
+hidden const char *__libc_get_version()
 {
 	return version;
 }
diff --git a/src/ldso/__dlsym.c b/src/ldso/__dlsym.c
index 99aafdf9..bf99dff8 100644
--- a/src/ldso/__dlsym.c
+++ b/src/ldso/__dlsym.c
@@ -1,8 +1,7 @@
 #include <dlfcn.h>
 #include "libc.h"
 
-__attribute__((__visibility__("hidden")))
-void __dl_seterr(const char *, ...);
+hidden void __dl_seterr(const char *, ...);
 
 static void *stub_dlsym(void *restrict p, const char *restrict s, void *restrict ra)
 {
diff --git a/src/ldso/dl_iterate_phdr.c b/src/ldso/dl_iterate_phdr.c
index f3160ef4..86c87ef8 100644
--- a/src/ldso/dl_iterate_phdr.c
+++ b/src/ldso/dl_iterate_phdr.c
@@ -4,8 +4,7 @@
 
 #define AUX_CNT 38
 
-__attribute__((__weak__, __visibility__("hidden")))
-extern const size_t _DYNAMIC[];
+extern weak hidden const size_t _DYNAMIC[];
 
 static int static_dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void *data), void *data)
 {
diff --git a/src/ldso/dlclose.c b/src/ldso/dlclose.c
index 0ef22319..a774209d 100644
--- a/src/ldso/dlclose.c
+++ b/src/ldso/dlclose.c
@@ -1,7 +1,7 @@
 #include <dlfcn.h>
+#include "libc.h"
 
-__attribute__((__visibility__("hidden")))
-int __dl_invalid_handle(void *);
+hidden int __dl_invalid_handle(void *);
 
 int dlclose(void *p)
 {
diff --git a/src/ldso/dlerror.c b/src/ldso/dlerror.c
index 378f0356..c8c718ab 100644
--- a/src/ldso/dlerror.c
+++ b/src/ldso/dlerror.c
@@ -23,8 +23,7 @@ void __dl_thread_cleanup(void)
 		free(self->dlerror_buf);
 }
 
-__attribute__((__visibility__("hidden")))
-void __dl_vseterr(const char *fmt, va_list ap)
+hidden void __dl_vseterr(const char *fmt, va_list ap)
 {
 	va_list ap2;
 	va_copy(ap2, ap);
@@ -43,8 +42,7 @@ void __dl_vseterr(const char *fmt, va_list ap)
 	self->dlerror_flag = 1;
 }
 
-__attribute__((__visibility__("hidden")))
-void __dl_seterr(const char *fmt, ...)
+hidden void __dl_seterr(const char *fmt, ...)
 {
 	va_list ap;
 	va_start(ap, fmt);
@@ -52,8 +50,7 @@ void __dl_seterr(const char *fmt, ...)
 	va_end(ap);
 }
 
-__attribute__((__visibility__("hidden")))
-int __dl_invalid_handle(void *);
+hidden int __dl_invalid_handle(void *);
 
 static int stub_invalid_handle(void *h)
 {
diff --git a/src/ldso/dlinfo.c b/src/ldso/dlinfo.c
index a173d1ac..1e2c5500 100644
--- a/src/ldso/dlinfo.c
+++ b/src/ldso/dlinfo.c
@@ -1,11 +1,10 @@
 #define _GNU_SOURCE
 #include <dlfcn.h>
+#include "libc.h"
 
-__attribute__((__visibility__("hidden")))
-int __dl_invalid_handle(void *);
+hidden int __dl_invalid_handle(void *);
 
-__attribute__((__visibility__("hidden")))
-void __dl_seterr(const char *, ...);
+hidden void __dl_seterr(const char *, ...);
 
 int dlinfo(void *dso, int req, void *res)
 {
diff --git a/src/ldso/dlopen.c b/src/ldso/dlopen.c
index dcdb4398..6b1d792a 100644
--- a/src/ldso/dlopen.c
+++ b/src/ldso/dlopen.c
@@ -1,8 +1,7 @@
 #include <dlfcn.h>
 #include "libc.h"
 
-__attribute__((__visibility__("hidden")))
-void __dl_seterr(const char *, ...);
+hidden void __dl_seterr(const char *, ...);
 
 static void *stub_dlopen(const char *file, int mode)
 {
diff --git a/src/ldso/tlsdesc.c b/src/ldso/tlsdesc.c
index a2985cb6..df7eb9c9 100644
--- a/src/ldso/tlsdesc.c
+++ b/src/ldso/tlsdesc.c
@@ -1,8 +1,7 @@
 #include <stddef.h>
 #include "libc.h"
 
-__attribute__((__visibility__("hidden")))
-ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic();
+hidden ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic();
 
 ptrdiff_t __tlsdesc_static()
 {
diff --git a/src/multibyte/internal.h b/src/multibyte/internal.h
index 421a3d4a..7d0e7828 100644
--- a/src/multibyte/internal.h
+++ b/src/multibyte/internal.h
@@ -1,11 +1,9 @@
 #define bittab __fsmu8
 
 #include <stdint.h>
+#include "libc.h"
 
-#ifdef __PIC__
-__attribute__((__visibility__("hidden")))
-#endif
-extern const uint32_t bittab[];
+extern hidden const uint32_t bittab[];
 
 /* Upper 6 state bits are a negative integer offset to bound-check next byte */
 /*    equivalent to: ( (b-0x80) | (b+offset) ) & ~0x3f      */
diff --git a/src/signal/sigaction.c b/src/signal/sigaction.c
index ac9a3ac2..2adedaa4 100644
--- a/src/signal/sigaction.c
+++ b/src/signal/sigaction.c
@@ -8,7 +8,8 @@
 
 volatile int dummy_lock[1] = { 0 };
 
-__attribute__((__visibility__("hidden")))
+extern hidden volatile int __abort_lock[1];
+
 weak_alias(dummy_lock, __abort_lock);
 
 static int unmask_done;
diff --git a/src/signal/sigsetjmp_tail.c b/src/signal/sigsetjmp_tail.c
index 78762aa2..252529a4 100644
--- a/src/signal/sigsetjmp_tail.c
+++ b/src/signal/sigsetjmp_tail.c
@@ -1,9 +1,9 @@
 #include <setjmp.h>
 #include <signal.h>
 #include "syscall.h"
+#include "libc.h"
 
-__attribute__((__visibility__("hidden")))
-int __sigsetjmp_tail(sigjmp_buf jb, int ret)
+hidden int __sigsetjmp_tail(sigjmp_buf jb, int ret)
 {
 	void *p = jb->__ss;
 	__syscall(SYS_rt_sigprocmask, SIG_SETMASK, ret?p:0, ret?0:p, _NSIG/8);
diff --git a/src/thread/__syscall_cp.c b/src/thread/__syscall_cp.c
index 09a2be84..afd82eff 100644
--- a/src/thread/__syscall_cp.c
+++ b/src/thread/__syscall_cp.c
@@ -1,8 +1,8 @@
 #include "pthread_impl.h"
 #include "syscall.h"
+#include "libc.h"
 
-__attribute__((__visibility__("hidden")))
-long __syscall_cp_c();
+hidden long __syscall_cp_c();
 
 static long sccp(syscall_arg_t nr,
                  syscall_arg_t u, syscall_arg_t v, syscall_arg_t w,
diff --git a/src/thread/__tls_get_addr.c b/src/thread/__tls_get_addr.c
index 3b6c9b1b..3bc60571 100644
--- a/src/thread/__tls_get_addr.c
+++ b/src/thread/__tls_get_addr.c
@@ -2,8 +2,7 @@
 #include "pthread_impl.h"
 #include "libc.h"
 
-__attribute__((__visibility__("hidden")))
-void *__tls_get_new(tls_mod_off_t *);
+hidden void *__tls_get_new(tls_mod_off_t *);
 
 void *__tls_get_addr(tls_mod_off_t *v)
 {
diff --git a/src/thread/arm/__set_thread_area.c b/src/thread/arm/__set_thread_area.c
index daf496c2..09de65aa 100644
--- a/src/thread/arm/__set_thread_area.c
+++ b/src/thread/arm/__set_thread_area.c
@@ -5,7 +5,7 @@
 
 #define HWCAP_TLS (1 << 15)
 
-extern const unsigned char __attribute__((__visibility__("hidden")))
+extern hidden const unsigned char
 	__a_barrier_oldkuser[], __a_barrier_v6[], __a_barrier_v7[],
 	__a_cas_v6[], __a_cas_v7[],
 	__a_gettp_cp15[];
@@ -22,8 +22,7 @@ extern const unsigned char __attribute__((__visibility__("hidden")))
 #define __a_gettp_kuser 0xffff0fe0
 #define __a_gettp_cp15 (uintptr_t)__a_gettp_cp15
 
-extern uintptr_t __attribute__((__visibility__("hidden")))
-	__a_barrier_ptr, __a_cas_ptr, __a_gettp_ptr;
+extern hidden uintptr_t __a_barrier_ptr, __a_cas_ptr, __a_gettp_ptr;
 
 int __set_thread_area(void *p)
 {
diff --git a/src/thread/pthread_attr_setinheritsched.c b/src/thread/pthread_attr_setinheritsched.c
index e540e846..605af973 100644
--- a/src/thread/pthread_attr_setinheritsched.c
+++ b/src/thread/pthread_attr_setinheritsched.c
@@ -1,8 +1,8 @@
 #include "pthread_impl.h"
 #include "syscall.h"
+#include "libc.h"
 
-__attribute__((__visibility__("hidden")))
-void *__start_sched(void *p)
+hidden void *__start_sched(void *p)
 {
 	struct start_sched_args *ssa = p;
 	void *start_arg = ssa->start_arg;
diff --git a/src/thread/pthread_cancel.c b/src/thread/pthread_cancel.c
index 5d458af2..43f8d405 100644
--- a/src/thread/pthread_cancel.c
+++ b/src/thread/pthread_cancel.c
@@ -4,8 +4,7 @@
 #include "syscall.h"
 #include "libc.h"
 
-__attribute__((__visibility__("hidden")))
-long __cancel(), __syscall_cp_asm(), __syscall_cp_c();
+hidden long __cancel(), __syscall_cp_asm(), __syscall_cp_c();
 
 long __cancel()
 {
@@ -45,8 +44,7 @@ static void _sigaddset(sigset_t *set, int sig)
 	set->__bits[s/8/sizeof *set->__bits] |= 1UL<<(s&8*sizeof *set->__bits-1);
 }
 
-__attribute__((__visibility__("hidden")))
-extern const char __cp_begin[1], __cp_end[1], __cp_cancel[1];
+extern hidden const char __cp_begin[1], __cp_end[1], __cp_cancel[1];
 
 static void cancel_handler(int sig, siginfo_t *si, void *ctx)
 {
diff --git a/src/thread/sh/__set_thread_area.c b/src/thread/sh/__set_thread_area.c
index 9c47f78d..34264bdd 100644
--- a/src/thread/sh/__set_thread_area.c
+++ b/src/thread/sh/__set_thread_area.c
@@ -7,14 +7,11 @@
 #define CPU_HAS_LLSC 0x0040
 #define CPU_HAS_CAS_L 0x0400
 
-__attribute__((__visibility__("hidden")))
-extern const char __sh_cas_gusa[], __sh_cas_llsc[], __sh_cas_imask[], __sh_cas_cas_l[];
+extern hidden const char __sh_cas_gusa[], __sh_cas_llsc[], __sh_cas_imask[], __sh_cas_cas_l[];
 
-__attribute__((__visibility__("hidden")))
-const void *__sh_cas_ptr;
+hidden const void *__sh_cas_ptr;
 
-__attribute__((__visibility__("hidden")))
-unsigned __sh_nommu;
+hidden unsigned __sh_nommu;
 
 int __set_thread_area(void *p)
 {
diff --git a/src/thread/sh/__unmapself.c b/src/thread/sh/__unmapself.c
index d4fb8be5..719392a6 100644
--- a/src/thread/sh/__unmapself.c
+++ b/src/thread/sh/__unmapself.c
@@ -12,7 +12,7 @@ void __unmapself_sh_nommu(void *, size_t);
 	: : "r"(pc), "r"(sp) : "r0", "memory" )
 #include "../__unmapself.c"
 #undef __unmapself
-extern __attribute__((__visibility__("hidden"))) unsigned __sh_nommu;
+extern hidden unsigned __sh_nommu;
 #else
 #define __sh_nommu 0
 #endif
diff --git a/src/thread/x32/syscall_cp_fixup.c b/src/thread/x32/syscall_cp_fixup.c
index b1f3a382..b1a1faa6 100644
--- a/src/thread/x32/syscall_cp_fixup.c
+++ b/src/thread/x32/syscall_cp_fixup.c
@@ -1,8 +1,9 @@
 #include <sys/syscall.h>
+#include "libc.h"
 
-__attribute__((__visibility__("hidden")))
-long __syscall_cp_internal(volatile void*, long long, long long, long long, long long,
-                             long long, long long, long long);
+hidden long __syscall_cp_internal(volatile void*, long long, long long,
+                                  long long, long long, long long,
+                                  long long, long long);
 
 struct __timespec { long long tv_sec; long tv_nsec; };
 struct __timespec_kernel { long long tv_sec; long long tv_nsec; };
@@ -12,9 +13,9 @@ struct __timespec_kernel { long long tv_sec; long long tv_nsec; };
 	ts->tv_nsec = __tsc(X)->tv_nsec; \
 	(X) = (unsigned long)ts; } } while(0)
 
-__attribute__((__visibility__("hidden")))
-long __syscall_cp_asm (volatile void * foo, long long n, long long a1, long long a2, long long a3,
-	                     long long a4, long long a5, long long a6)
+hidden long __syscall_cp_asm (volatile void * foo, long long n, long long a1,
+                              long long a2, long long a3, long long a4,
+                              long long a5, long long a6)
 {
 	struct __timespec_kernel ts[1];
 	switch (n) {