|
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.