mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-31 06:15:24 +00:00
pie: provide memcpy/memcmp/memset for noglibc case
Use alias function attribute to provide memcpy(), memcmp() and memset() in case we're not linking with libc. This is needed as compiler can generate calls to those functions (clang actually does that). [v2: add comment, move aliases to under HAS_BUILTIN_*] https://travis-ci.org/kolyshkin/criu/builds/174634847 Idea-by: Andrei Vagin <avagin@openvz.org> Signed-off-by: Kir Kolyshkin <kir@openvz.org> Reviewed-by: Dmitry Safonov <dsafonov@virtuozzo.com> Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
This commit is contained in:
committed by
Pavel Emelyanov
parent
f845d9e4e0
commit
bdf60512de
@@ -3,8 +3,16 @@
|
||||
|
||||
#include "common/compiler.h"
|
||||
|
||||
/* C compiler may generate calls to memcmp, memset, memcpy and memmove,
|
||||
* so it relies on those to be available during linking.
|
||||
* In case we are not linking our code against glibc, we set CR_NOGLIBC
|
||||
* and have to provide our own implementations of mem*() functions.
|
||||
*
|
||||
* For now, not having memmove() seems OK for both gcc and clang.
|
||||
*/
|
||||
|
||||
#ifndef HAS_BUILTIN_MEMCPY
|
||||
static always_inline void *builtin_memcpy(void *to, const void *from, size_t n)
|
||||
static __maybe_unused void *builtin_memcpy(void *to, const void *from, size_t n)
|
||||
{
|
||||
size_t i;
|
||||
unsigned char *cto = to;
|
||||
@@ -16,10 +24,14 @@ static always_inline void *builtin_memcpy(void *to, const void *from, size_t n)
|
||||
|
||||
return to;
|
||||
}
|
||||
#ifdef CR_NOGLIBC
|
||||
void *memcpy(void *to, const void *from, size_t n) \
|
||||
__attribute__ ((weak, alias ("builtin_memcpy")));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef HAS_BUILTIN_MEMCMP
|
||||
static always_inline int builtin_memcmp(const void *cs, const void *ct, size_t count)
|
||||
static __maybe_unused int builtin_memcmp(const void *cs, const void *ct, size_t count)
|
||||
{
|
||||
const unsigned char *su1, *su2;
|
||||
int res = 0;
|
||||
@@ -29,6 +41,10 @@ static always_inline int builtin_memcmp(const void *cs, const void *ct, size_t c
|
||||
break;
|
||||
return res;
|
||||
}
|
||||
#ifdef CR_NOGLIBC
|
||||
int memcmp(const void *cs, const void *ct, size_t count) \
|
||||
__attribute__ ((weak, alias ("builtin_memcmp")));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef HAS_BUILTIN_STRNCMP
|
||||
@@ -47,7 +63,7 @@ static always_inline int builtin_strncmp(const char *cs, const char *ct, size_t
|
||||
#endif
|
||||
|
||||
#ifndef HAS_BUILTIN_MEMSET
|
||||
static always_inline void *builtin_memset(void *s, const int c, size_t count)
|
||||
static __maybe_unused void *builtin_memset(void *s, const int c, size_t count)
|
||||
{
|
||||
char *dest = s;
|
||||
size_t i = 0;
|
||||
@@ -57,6 +73,10 @@ static always_inline void *builtin_memset(void *s, const int c, size_t count)
|
||||
|
||||
return s;
|
||||
}
|
||||
#ifdef CR_NOGLIBC
|
||||
void *memset(void *s, const int c, size_t count) \
|
||||
__attribute__ ((weak, alias ("builtin_memset")));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* __CR_ASM_GENERIC_STRING_H__ */
|
||||
|
Reference in New Issue
Block a user