[Toybox] _GNU_SOURCE definition problem
Georgi Chorbadzhiyski
gf at unixsol.org
Fri Mar 9 18:25:22 PST 2012
On 3/10/12 4:14 AM, Rob Landley wrote:
> On 03/09/2012 04:39 PM, Georgi Chorbadzhiyski wrote:
>> On 3/9/12 7:47 PM, Rob Landley wrote:
>>> On 03/09/2012 08:14 AM, Georgi Chorbadzhiyski wrote:
>>>> Removing _GNU_SOURCE breaks toys/unshare compilation.
>>>
>>> Building under what?
>>>
>>> In /usr/include/features.h:
>>>
>>> #if defined _BSD_SOURCE || defined _SVID_SOURCE
>>> # define __USE_MISC 1
>>> #endif
>>>
>>> sched.h includes bits/sched.h, and in /usr/include/bits/sched.h the
>>> CLONE_NEW* defines are all in #ifdef __USE_MISC
>>>
>>> So... works for me? (Just did a test build...)
>>
>> From /usr/include/bits/sched.h [1] on my desktop (glibc-2.14.1,
>> slack-current)
>>
>> #ifdef __USE_GNU
>
> That's the double underscore macro, that's #defined internally by
> /usr/incldue/features.h in response to some other macro.
>
>> ...
>> # define CLONE_NEWUTS 0x04000000 /* New utsname group. */
>> # define CLONE_NEWIPC 0x08000000 /* New ipcs. */
>> # define CLONE_NEWUSER 0x10000000 /* New user namespace. */
>> # define CLONE_NEWPID 0x20000000 /* New pid namespace. */
>> # define CLONE_NEWNET 0x40000000 /* New network namespace. */
>> # define CLONE_IO 0x80000000 /* Clone I/O context. */
>> ...
>
> I can #include linux/sched.h directly if this is really a problem.
> That's the more correct thing to do since this is a recently added linux
> kernel feature, and has nothing to do with gnu anything.
>
>> #endif
>>
>> ...
>>
>> #ifdef __USE_GNU
>> /* Clone current process. */
>> extern int clone (int (*__fn) (void *__arg), void *__child_stack,
>> int __flags, void *__arg, ...) __THROW;
>
> Hang on, you don't get _clone_ unless you say _USE_GNU? I get it if I
> don't specify _any_ feature test macro.
>
> Something is very broken here.
>
>> Resulting in:
>>
>> toys/unshare.c: In function ‘unshare_main’:
>> toys/unshare.c:32:20: error: ‘CLONE_NEWNS’ undeclared (first use in this
>> function)
>> toys/unshare.c:32:20: note: each undeclared identifier is reported only
>> once for each function it appears in
>> toys/unshare.c:32:33: error: ‘CLONE_NEWUTS’ undeclared (first use in
>> this function)
>> toys/unshare.c:32:47: error: ‘CLONE_NEWIPC’ undeclared (first use in
>> this function)
>> toys/unshare.c:32:61: error: ‘CLONE_NEWNET’ undeclared (first use in
>> this function)
>> toys/unshare.c:40:2: warning: implicit declaration of function ‘unshare’
>> [-Wimplicit-function-declaration]
>> make: *** [toybox] Error 1
>>
>> glibc insists that this Linux only functionality is behind __USE_GNU
>> which is declared in features.h if _GNU_SOURCE is declared [2].
>
> glibc 2.11.1 here does not, sounds like a recent regression.
>
> But sure, I can #include linux/sched.h to get this.
Adding #include <linux/sched.h> gets me the flag definitions but
unshare() is still only available "guarded" by _GNU_SOURCE. Damn.
toys/unshare.c: In function ‘unshare_main’:
toys/unshare.c:42:2: warning: implicit declaration of function ‘unshare’ [-Wimplicit-function-declaration]
make: *** [toybox] Error 1
gf at gf:~/git/toybox$ cd /usr/include
gf at gf:/usr/include$ grep -rw unshare *
bits/sched.h:extern int unshare (int __flags) __THROW;
--
Georgi Chorbadzhiyski
http://georgi.unixsol.org/
More information about the Toybox
mailing list