Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAK1hOcNjVG2zM4hxzwar3M=HB7d6Yq1RjzmwZiDhCjRj8fwOcg@mail.gmail.com>
Date: Fri, 9 Oct 2015 21:11:08 +0200
From: Denys Vlasenko <vda.linux@...glemail.com>
To: Rich Felker <dalias@...ifal.cx>
Cc: Rob Landley <rob@...dley.net>, Aboriginal Linux <aboriginal@...ts.landley.net>, 
	musl <musl@...ts.openwall.com>
Subject: Re: Re: musl and kernel headers [was Re: system-images 1.4.2:
 od is broken; bzip2 is missing]

On Thu, Oct 8, 2015 at 6:58 PM, Rich Felker <dalias@...ifal.cx> wrote:
>> > Including kernel headers is just really problematic. These days they
>> > try to make it work on glibc with a complex dance between glibc's
>> > headers and the kernel headers. You're likely to have the best luck by
>> > including the libc headers first.
>>
>> brctl.c  was including <linux/if_bridge.h> after <netinet/in.h>
>
> The problem is linux/libc-compat.h, which should fix this, only works
> on glibc, by design. See:
>
> #ifndef _LIBC_COMPAT_H
> #define _LIBC_COMPAT_H
>
> /* We have included glibc headers... */
> #if defined(__GLIBC__)
>
> /* Coordinate with glibc netinet/in.h header. */
> #if defined(_NETINET_IN_H)
>
> If you patch it like this:
>
> -#if defined(__GLIBC__)
> +#if 1
>
> then it should mostly work but it's still all a big hack. I think
> that's what distros are doing. The problem is that the same header is
> trying to do two different things:
>
> 1. Provide extra linux-kernel-API stuff that's not in the
>    libc/userspace headers.
>
> 2. Provide definitions of the standard types and constants for uClibc
>    and klibc, which don't have complete libc headers and rely on the
>    kernel headers for definitions.
>
> These two uses really should be separated out into separate headers so
> that the latter only get included explicitly by uClibc and klibc and
> otherwise remain completely unused. But that would require coordinated
> changes/upgrades which are unlikely to happen. :(

Looking at kernel's libc-compat.h, it looks like you can get away
with using __UAPI_DEF_foo's like this?


#if  defined(__UAPI_DEF_SOCKADDR_IN) && __UAPI_DEF_SOCKADDR_IN == 1
/* kernel already defined the struct, do nothing */
#else
struct sockaddr_in {
        ...
};
#undef __UAPI_DEF_SOCKADDR_IN
/* tell kernel to not define the struct */
#define __UAPI_DEF_SOCKADDR_IN 0
#endif

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.