Messages in this thread | | | From | Florian Weimer <> | Subject | Re: For review: documentation of clone3() system call | Date | Thu, 07 Nov 2019 17:10:51 +0100 |
| |
* Christian Brauner:
> I've always been confused by the "..." for the glibc wrapper. The glibc > prototype in bits/sched.h also looks like this: > > extern int clone (int (*__fn) (void *__arg), void *__child_stack, int __flags, void *__arg, ...) __THROW; > > The additionl args parent_tid, tls, and child_tid are present in _all_ > clone version in the same order. In fact the glibc wrapper here give the > illusion that it's parent_tid, tls, child_tid. The underlying syscall > has a different order parent_tidptr, child_tidptr, tls. > > Florian, can you advise what prototype we should mention for the glibc > clone() wrapper here. I'd like it to be as simple as possible and get > rid of the ... > Architectural differences are explained in detail below anyway.
Our header has:
/* Clone current process. */ extern int clone (int (*__fn) (void *__arg), void *__child_stack, int __flags, void *__arg, ...) __THROW;
I have not checked all assembler implementations. In theory there could be one that relies on the different calling convention for variadic functions (e.g., the existence of a parameter save area on POWER). Or that swaps arguments in some architecure-specific way. 8-(
I don't have much guidance on this matter, sorry. I expect that for clone3, we'll provide a same-stack variant as well (for fork/vfork-like usage), which will be much closer to the kernel interface. clone/clone2 doesn't seem very fixable to me at this point.
Thanks, Florian
| |