Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753172AbdGHU3X (ORCPT ); Sat, 8 Jul 2017 16:29:23 -0400 Received: from mout02.posteo.de ([185.67.36.66]:59948 "EHLO mout02.posteo.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753131AbdGHU3U (ORCPT ); Sat, 8 Jul 2017 16:29:20 -0400 Date: Sat, 8 Jul 2017 16:27:32 -0400 From: Felix Janda To: linux-kernel@vger.kernel.org Cc: linux-api@vger.kernel.org, musl@lists.openwall.com, "David S. Miller" , "Carlos O'Donell" Subject: [PATCHv2] uapi libc compat: add fallback for unsupported libcs Message-ID: <20170708202732.GA1891@nyan> Mail-Followup-To: linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, musl@lists.openwall.com, "David S. Miller" , Carlos O'Donell MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.7.2 (2016-11-26) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4490 Lines: 140 libc-compat.h aims to prevent symbol collisions between uapi and libc headers for each supported libc. This requires continuous coordination between them. The goal of this commit is to improve the situation for libcs (such as musl) which are not yet supported and/or do not wish to be explicitly supported, while not affecting supported libcs. More precisely, with this commit, unsupported libcs can request the suppression of any specific uapi definition by defining the correspondings _UAPI_DEF_* macro as 0. This can fix symbol collisions for them, as long as the libc headers are included before the uapi headers. Inclusion in the other order is outside the scope of this commit. All infrastructure in order to enable this fallback for unsupported libcs is already in place, except that libc-compat.h unconditionally defines all _UAPI_DEF_* macros to 1 for all unsupported libcs so that any previous definitions are ignored. In order to fix this, this commit merely makes these definitions conditional. This commit together with the musl libc commit http://git.musl-libc.org/cgit/musl/commit/?id=04983f2272382af92eb8f8838964ff944fbb8258 fixes for example the following compiler errors when is included after musl's : ./linux/in6.h:32:8: error: redefinition of 'struct in6_addr' ./linux/in6.h:49:8: error: redefinition of 'struct sockaddr_in6' ./linux/in6.h:59:8: error: redefinition of 'struct ipv6_mreq' Signed-off-by: Felix Janda Acked-by: Rich Felker --- v2: The only change to the previous version is the commit title and message. --- include/uapi/linux/libc-compat.h | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h index 44b8a6b..c316725 100644 --- a/include/uapi/linux/libc-compat.h +++ b/include/uapi/linux/libc-compat.h @@ -171,42 +171,94 @@ #else /* !defined(__GLIBC__) */ /* Definitions for if.h */ +#if !defined(__UAPI_DEF_IF_IFCONF) #define __UAPI_DEF_IF_IFCONF 1 +#endif +#if !defined(__UAPI_DEF_IF_IFMAP) #define __UAPI_DEF_IF_IFMAP 1 +#endif +#if !defined(__UAPI_DEF_IFNAMSIZ) #define __UAPI_DEF_IF_IFNAMSIZ 1 +#endif +#if !defined(__UAPI_DEF_IFREQ) #define __UAPI_DEF_IF_IFREQ 1 +#endif /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ +#if !defined(__UAPI_DEF_IF_NET_DEVICE_FLAGS) #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 +#endif /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ +#if !defined(__UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO) #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 +#endif /* Definitions for in.h */ +#if !defined(__UAPI_DEF_IN_ADDR) #define __UAPI_DEF_IN_ADDR 1 +#endif +#if !defined(__UAPI_DEF_IN_IPPROTO) #define __UAPI_DEF_IN_IPPROTO 1 +#endif +#if !defined(__UAPI_DEF_IN_PKTINFO) #define __UAPI_DEF_IN_PKTINFO 1 +#endif +#if !defined(__UAPI_DEF_IP_MREQ) #define __UAPI_DEF_IP_MREQ 1 +#endif +#if !defined(__UAPI_DEF_SOCKADDR_IN) #define __UAPI_DEF_SOCKADDR_IN 1 +#endif +#if !defined(__UAPI_DEF_IN_CLASS) #define __UAPI_DEF_IN_CLASS 1 +#endif /* Definitions for in6.h */ +#if !defined(__UAPI_DEF_IN6_ADDR) #define __UAPI_DEF_IN6_ADDR 1 +#endif +#if !defined(__UAPI_DEF_IN6_ADDR_ALT) #define __UAPI_DEF_IN6_ADDR_ALT 1 +#endif +#if !defined(__UAPI_DEF_SOCKADDR_IN6) #define __UAPI_DEF_SOCKADDR_IN6 1 +#endif +#if !defined(__UAPI_DEF_IPV6_MREQ) #define __UAPI_DEF_IPV6_MREQ 1 +#endif +#if !defined(__UAPI_DEF_IPPROTO_V6) #define __UAPI_DEF_IPPROTO_V6 1 +#endif +#if !defined(__UAPI_DEF_IPV6_OPTIONS) #define __UAPI_DEF_IPV6_OPTIONS 1 +#endif +#if !defined(__UAPI_DEF_IN6_PKTINFO) #define __UAPI_DEF_IN6_PKTINFO 1 +#endif +#if !defined(__UAPI_DEF_IP6_MTUINFO) #define __UAPI_DEF_IP6_MTUINFO 1 +#endif /* Definitions for ipx.h */ +#if !defined(__UAPI_DEF_SOCKADDR_IPX) #define __UAPI_DEF_SOCKADDR_IPX 1 +#endif +#if !defined(__UAPI_DEF_IPX_ROUTE_DEFINITION) #define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 +#endif +#if !defined(__UAPI_DEF_IPX_INTERFACE_DEFINITION) #define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 +#endif +#if !defined(__UAPI_DEF_IPX_CONFIG_DATA) #define __UAPI_DEF_IPX_CONFIG_DATA 1 +#endif +#if !defined(__UAPI_DEF_IPX_ROUTE_DEF) #define __UAPI_DEF_IPX_ROUTE_DEF 1 +#endif /* Definitions for xattr.h */ +#if !defined(__UAPI_DEF_XATTR) #define __UAPI_DEF_XATTR 1 +#endif #endif /* __GLIBC__ */ -- 2.7.3