From bc8bb57301186279c74b55cd2daec9131d087ef8 Mon Sep 17 00:00:00 2001 From: guenther <> Date: Wed, 29 Nov 2017 05:13:57 +0000 Subject: clang doesn't propagate attributes like "asm labels" and "visibility(hidden)" to builtins like mem{set,cpy,move} and __stack_smash_handler. So, when building with clang, instead mark those as protected visibility to get rid of the PLT relocations. We can't take the address of them then, but that's ok: it's a build-time error not a run-time error. ok kettenis@ --- src/lib/libc/include/namespace.h | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'src/lib/libc/include/namespace.h') diff --git a/src/lib/libc/include/namespace.h b/src/lib/libc/include/namespace.h index 980c1a8dd6..73b845e10f 100644 --- a/src/lib/libc/include/namespace.h +++ b/src/lib/libc/include/namespace.h @@ -1,4 +1,4 @@ -/* $OpenBSD: namespace.h,v 1.10 2016/05/07 19:05:22 guenther Exp $ */ +/* $OpenBSD: namespace.h,v 1.11 2017/11/29 05:13:57 guenther Exp $ */ #ifndef _LIBC_NAMESPACE_H_ #define _LIBC_NAMESPACE_H_ @@ -154,23 +154,35 @@ #define DEF_CANCEL(x) __weak_alias(x, CANCEL(x)) #define DEF_WRAP(x) __weak_alias(x, WRAP(x)) #define DEF_SYS(x) __strong_alias(_thread_sys_##x, HIDDEN(x)) +#ifdef __clang__ +#define DEF_BUILTIN(x) __asm("") +#define BUILTIN __attribute__((__visibility__("protected"))) +#else +#define DEF_BUILTIN(x) DEF_STRONG(x) +#define BUILTIN +#endif #define MAKE_CLONE(dst, src) __dso_hidden typeof(dst) HIDDEN(dst) \ __attribute__((alias (HIDDEN_STRING(src)))) /* - * gcc will generate calls to the functions below. + * gcc and clang will generate calls to the functions below. * Declare and redirect them here so we always go * directly to our hidden aliases. */ #include -void *memcpy(void *__restrict, const void *__restrict, __size_t); -void *memset(void *, int, __size_t); -void __stack_smash_handler(const char [], int __attribute__((__unused__))); +BUILTIN void *memmove(void *, const void *, __size_t); +BUILTIN void *memcpy(void *__restrict, const void *__restrict, __size_t); +BUILTIN void *memset(void *, int, __size_t); +BUILTIN void __stack_smash_handler(const char [], int __unused); +#ifndef __clang__ +PROTO_NORMAL(memmove); PROTO_NORMAL(memcpy); PROTO_NORMAL(memset); PROTO_NORMAL(__stack_smash_handler); +#endif +#undef BUILTIN #endif /* _LIBC_NAMESPACE_H_ */ -- cgit v1.2.3-55-g6feb