From: Luca Boccassi Date: Sat, 8 Jul 2023 15:43:28 +0000 (+0100) Subject: process-util: use clone2 on ia64 X-Git-Tag: v254-rc2~52^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=840ac5cd1abbcee0c8def620bdabfb66d0707ebf;p=thirdparty%2Fsystemd.git process-util: use clone2 on ia64 glibc does not provide clone() on ia64, only clone2. But only as a symbol in the shared library, there's no prototype in the gblic headers, so we have to define it, copied from the manpage. --- diff --git a/src/basic/missing_syscall.h b/src/basic/missing_syscall.h index 062decaff62..ddee457f444 100644 --- a/src/basic/missing_syscall.h +++ b/src/basic/missing_syscall.h @@ -654,3 +654,17 @@ static inline ssize_t missing_getdents64(int fd, void *buffer, size_t length) { # define getdents64 missing_getdents64 #endif + +/* ======================================================================= */ + +/* glibc does not provide clone() on ia64, only clone2(). Not only that, but it also doesn't provide a + * prototype, only the symbol in the shared library (it provides a prototype for clone(), but not the + * symbol in the shared library). */ +#if defined(__ia64__) +int __clone2(int (*fn)(void *), void *stack_base, size_t stack_size, int flags, void *arg); +#define HAVE_CLONE 0 +#else +/* We know that everywhere else clone() is available, so we don't bother with a meson check (that takes time + * at build time) and just define it. Once the kernel drops ia64 support, we can drop this too. */ +#define HAVE_CLONE 1 +#endif diff --git a/src/basic/process-util.c b/src/basic/process-util.c index 6cf882866fd..7182e15b610 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -1177,7 +1177,11 @@ pid_t clone_with_nested_stack(int (*fn)(void *), int flags, void *userdata) { mystack = (uint8_t*) mystack + ps; /* move pointer one page ahead since stacks usually grow backwards */ mystack = (void*) ALIGN_TO((uintptr_t) mystack, ps); /* align to page size (moving things further ahead) */ +#if HAVE_CLONE pid = clone(fn, mystack, flags, userdata); +#else + pid = __clone2(fn, mystack, ps, flags, userdata); +#endif if (pid < 0) return -errno;