2017-04-12 20:31:30

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH resend 0/4] uapi glibc compat: fix musl libc compatibility

The code from libc-compat.h depends on some glibc specific defines and
causes compile problems with the musl libc. These patches remove some
of the glibc dependencies. With these patches the LEDE (OpenWrt) base
user space applications can be build with unmodified kernel headers and
musl libc.

This was compile tested with the user space from LEDE (OpenWrt) with
musl 1.1.16, glibc 2.25 and uClibc-ng 1.0.22.


David Heidelberger (1):
uapi/if_ether.h: prevent redefinition of struct ethhdr

Hauke Mehrtens (3):
uapi glibc compat: add libc compat code when not build for kernel
uapi glibc compat: fix build if libc defines IFF_ECHO
uapi glibc compat: Do not check for __USE_MISC

include/uapi/linux/if_ether.h | 3 +++
include/uapi/linux/libc-compat.h | 25 +++++++++++++++++++------
2 files changed, 22 insertions(+), 6 deletions(-)

--
2.11.0


2017-04-12 20:31:32

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH resend 2/4] uapi glibc compat: fix build if libc defines IFF_ECHO

musl 1.1.15 defines IFF_ECHO and the other net_device_flags options.
When a user application includes linux/if.h and net/if.h the compile
will fail.

Activate __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO only when
it is needed. This should also make this work in case glibc will add
these defines.

Acked-by: Mikko Rapeli <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
include/uapi/linux/libc-compat.h | 2 ++
1 file changed, 2 insertions(+)

diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h
index 7c1fead03c50..49a8cc3138ae 100644
--- a/include/uapi/linux/libc-compat.h
+++ b/include/uapi/linux/libc-compat.h
@@ -64,9 +64,11 @@
/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0
/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
+#ifndef IFF_ECHO
#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
+#endif /* IFF_ECHO */

#else /* _NET_IF_H */

--
2.11.0

2017-04-12 20:32:01

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH resend 4/4] uapi/if_ether.h: prevent redefinition of struct ethhdr

From: David Heidelberger <[email protected]>

Musl provides its own ethhdr struct definition. Add a guard to prevent
its definition of the appropriate musl header has already been included.

Acked-by: Mikko Rapeli <[email protected]>
Signed-off-by: John Spencer <[email protected]>
Tested-by: David Heidelberger <[email protected]>
Signed-off-by: Jonas Gorski <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
include/uapi/linux/if_ether.h | 3 +++
include/uapi/linux/libc-compat.h | 11 +++++++++++
2 files changed, 14 insertions(+)

diff --git a/include/uapi/linux/if_ether.h b/include/uapi/linux/if_ether.h
index 5bc9bfd816b7..fb5ab8c1e753 100644
--- a/include/uapi/linux/if_ether.h
+++ b/include/uapi/linux/if_ether.h
@@ -22,6 +22,7 @@
#define _UAPI_LINUX_IF_ETHER_H

#include <linux/types.h>
+#include <linux/libc-compat.h>

/*
* IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble
@@ -142,11 +143,13 @@
* This is an Ethernet frame header.
*/

+#if __UAPI_DEF_ETHHDR
struct ethhdr {
unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
unsigned char h_source[ETH_ALEN]; /* source ether addr */
__be16 h_proto; /* packet type ID field */
} __attribute__((packed));
+#endif


#endif /* _UAPI_LINUX_IF_ETHER_H */
diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h
index ce2fa8a4ced6..c92d32f213d1 100644
--- a/include/uapi/linux/libc-compat.h
+++ b/include/uapi/linux/libc-compat.h
@@ -87,6 +87,14 @@

#endif /* _NET_IF_H */

+/* musl defines the ethhdr struct itself in its netinet/if_ether.h.
+ * Glibc just includes the kernel header and uses a different guard. */
+#if defined(_NETINET_IF_ETHER_H)
+#define __UAPI_DEF_ETHHDR 0
+#else
+#define __UAPI_DEF_ETHHDR 1
+#endif
+
/* Coordinate with glibc netinet/in.h header. */
#if defined(_NETINET_IN_H)

@@ -182,6 +190,9 @@
/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1

+/* Definitions for if_ether.h */
+#define __UAPI_DEF_ETHHDR 1
+
/* Definitions for in.h */
#define __UAPI_DEF_IN_ADDR 1
#define __UAPI_DEF_IN_IPPROTO 1
--
2.11.0

2017-04-12 20:32:20

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH resend 3/4] uapi glibc compat: Do not check for __USE_MISC

__USE_MISC is glibc specific and not available in musl libc. Only do
this check when glibc is used. This fixes a problem with musl libc.

Acked-by: Mikko Rapeli <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
include/uapi/linux/libc-compat.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h
index 49a8cc3138ae..ce2fa8a4ced6 100644
--- a/include/uapi/linux/libc-compat.h
+++ b/include/uapi/linux/libc-compat.h
@@ -51,8 +51,8 @@
/* We have included libc headers... */
#if !defined(__KERNEL__)

-/* Coordinate with glibc net/if.h header. */
-#if defined(_NET_IF_H) && defined(__USE_MISC)
+/* Coordinate with libc net/if.h header. */
+#if defined(_NET_IF_H) && (!defined(__GLIBC__) || defined(__USE_MISC))

/* GLIBC headers included first so don't define anything
* that would already be defined. */
--
2.11.0

2017-04-12 20:31:27

by Hauke Mehrtens

[permalink] [raw]
Subject: [PATCH resend 1/4] uapi glibc compat: add libc compat code when not build for kernel

Instead of checking if this header file is used in the glibc, check if
iti is not used in kernel context, this way it will also work with
other libc implementations like musl.

Acked-by: Mikko Rapeli <[email protected]>
Signed-off-by: Hauke Mehrtens <[email protected]>
---
include/uapi/linux/libc-compat.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h
index 44b8a6bd5fe1..7c1fead03c50 100644
--- a/include/uapi/linux/libc-compat.h
+++ b/include/uapi/linux/libc-compat.h
@@ -48,8 +48,8 @@
#ifndef _UAPI_LIBC_COMPAT_H
#define _UAPI_LIBC_COMPAT_H

-/* We have included glibc headers... */
-#if defined(__GLIBC__)
+/* We have included libc headers... */
+#if !defined(__KERNEL__)

/* Coordinate with glibc net/if.h header. */
#if defined(_NET_IF_H) && defined(__USE_MISC)
@@ -168,7 +168,7 @@
/* If we did not see any headers from any supported C libraries,
* or we are being included in the kernel, then define everything
* that we need. */
-#else /* !defined(__GLIBC__) */
+#else /* defined(__KERNEL__) */

/* Definitions for if.h */
#define __UAPI_DEF_IF_IFCONF 1
@@ -208,6 +208,6 @@
/* Definitions for xattr.h */
#define __UAPI_DEF_XATTR 1

-#endif /* __GLIBC__ */
+#endif /* __KERNEL__ */

#endif /* _UAPI_LIBC_COMPAT_H */
--
2.11.0

2017-04-13 10:35:19

by Sergei Shtylyov

[permalink] [raw]
Subject: Re: [PATCH resend 1/4] uapi glibc compat: add libc compat code when not build for kernel

Hello!

On 4/12/2017 11:31 PM, Hauke Mehrtens wrote:

> Instead of checking if this header file is used in the glibc, check if
> iti is not used in kernel context, this way it will also work with

s/iti/it/.

> other libc implementations like musl.
>
> Acked-by: Mikko Rapeli <[email protected]>
> Signed-off-by: Hauke Mehrtens <[email protected]>

[...]

MBR, Sergei

2017-04-17 16:55:47

by David Miller

[permalink] [raw]
Subject: Re: [PATCH resend 3/4] uapi glibc compat: Do not check for __USE_MISC

From: Hauke Mehrtens <[email protected]>
Date: Wed, 12 Apr 2017 22:31:02 +0200

> __USE_MISC is glibc specific and not available in musl libc. Only do
> this check when glibc is used. This fixes a problem with musl libc.
>
> Acked-by: Mikko Rapeli <[email protected]>
> Signed-off-by: Hauke Mehrtens <[email protected]>

You yourself introduce this problem in patch #1.

The code before patch #1 was perfectly fine, as this code block only
existing in an area protected by __GLIBC__.

So you have to redo these patches such that you deal with all of
the fallout from changing __GLIBC__ into !__KERNEL__ at the same
time that you make that change.

Thanks.