iproute2: Fix undeclared __kernel_long_t type build error in RHEL 6.8
Subsystems (2)
PATCH 1/1 iproute2: Fix undeclared __kernel_long_t type build error in RHEL 6.8
From: Leon Romanovsky <[email protected]>
Add asm/posix_types.h header file to the list of needed includes, because the headers files in RHEL 6.8 are too old and doesn't have declaration of __kernel_long_t.
In file included from ../include/uapi/linux/kernel.h:5,
from ../include/uapi/linux/netfilter/x_tables.h:4,
from ../include/xtables.h:20,
from em_ipset.c:26:../include/uapi/linux/sysinfo.h:9: error: expected specifier-qualifier-list before ‘__kernel_long_t’
---
Stephen,
I don't know how to properly solve this type of errors and would like to hear your guidance on it.
Should I simply add kernel file? Or maybe I need to add HAVE_xxx checks to configure script to check __kernel_long_t existence and declare only this type?
I also have another build error on RHEL 6.8 system and looking for a solution.
In file included from em_ipset.c:26:../include/xtables.h:35:29: error: xtables-version.h: No such file or directory make[1]: *** [em_ipset.o] Error 1
The iptables-devel is iptables-devel-1.4.7-16.el6.x86_64 so check_xt() success, but RH headers don't have xtable-version.h and the relevant defines are embedded in the main xtables.h header file.
Thanks
--- include/uapi/asm/posix_types.h | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 include/uapi/asm/posix_types.h
include/uapi/asm/posix_types.h new file +97 -0
@@ -0,0 +1,97 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __ASM_GENERIC_POSIX_TYPES_H +#define __ASM_GENERIC_POSIX_TYPES_H + +#include <asm/bitsperlong.h> +/* +* This file is generally used by user-level software, so you need to +* be a little careful about namespace pollution etc. +* +* First the types that are often defined in different ways across +* architectures, so that you can override them. +*/ + +#ifndef __kernel_long_t +typedef long __kernel_long_t ; +typedef unsigned long __kernel_ulong_t ; +#endif + +#ifndef __kernel_ino_t +typedef __kernel_ulong_t __kernel_ino_t ; +#endif + +#ifndef __kernel_mode_t +typedef unsigned int __kernel_mode_t ; +#endif + +#ifndef __kernel_pid_t +typedef int __kernel_pid_t ; +#endif + +#ifndef __kernel_ipc_pid_t +typedef int __kernel_ipc_pid_t ; +#endif + +#ifndef __kernel_uid_t +typedef unsigned int __kernel_uid_t ; +typedef unsigned int __kernel_gid_t ; +#endif + +#ifndef __kernel_suseconds_t +typedef __kernel_long_t __kernel_suseconds_t ; +#endif + +#ifndef __kernel_daddr_t +typedef int __kernel_daddr_t ; +#endif + +#ifndef __kernel_uid32_t +typedef unsigned int __kernel_uid32_t ; +typedef unsigned int __kernel_gid32_t ; +#endif + +#ifndef __kernel_old_uid_t +typedef __kernel_uid_t __kernel_old_uid_t ; +typedef __kernel_gid_t __kernel_old_gid_t ; +#endif + +#ifndef __kernel_old_dev_t +typedef unsigned int __kernel_old_dev_t ; +#endif + +/* +* Most 32 bit architectures use "unsigned int" size_t, +* and all 64 bit architectures use "unsigned long" size_t. +*/ +#ifndef __kernel_size_t +#if __BITS_PER_LONG !=64 +typedef unsigned int __kernel_size_t ; +typedef int __kernel_ssize_t ; +typedef int __kernel_ptrdiff_t ; +#else +typedef __kernel_ulong_t __kernel_size_t ; +typedef __kernel_long_t __kernel_ssize_t ; +typedef __kernel_long_t __kernel_ptrdiff_t ; +#endif +#endif + +#ifndef __kernel_fsid_t +typedef struct { +int val[2 ]; +}__kernel_fsid_t ; +#endif + +/* +* anything below here should be completely generic +*/ +typedef __kernel_long_t __kernel_off_t ; +typedef long long __kernel_loff_t ; +typedef __kernel_long_t __kernel_time_t ; +typedef __kernel_long_t __kernel_clock_t ; +typedef int __kernel_timer_t ; +typedef int __kernel_clockid_t ; +typedef char *__kernel_caddr_t ; +typedef unsigned short __kernel_uid16_t ; +typedef unsigned short __kernel_gid16_t ; + +#endif /* __ASM_GENERIC_POSIX_TYPES_H */
Quoted 7 lines · On Fri, 1 Dec 2017 13:04:51 +0200 Leon Romanovsky <[email protected]> wrote:
From: Leon Romanovsky <[email protected]>
Add
asm/posix_types.hheader file to the list of needed includes, because the headers files in RHEL 6.8 are too old and doesn't have declaration of__kernel_long_t.In file included from
../include/uapi/linux/kernel.h:5,
Quoted 8 lines
from ../include/uapi/linux/netfilter/x_tables.h:4, from ../include/xtables.h:20, from em_ipset.c:26:
../include/uapi/linux/sysinfo.h:9: error: expected specifier-qualifier-list before ‘__kernel_long_t’Cc Riad Abo Raed <[email protected]>Cc Guy Ergas <[email protected]>Signed-off-by Leon Romanovsky <[email protected]>
I see the problem, but the solution of dragging in posix_types.h would be too much of a long term maintenance issue. All the headers in uapi are regularly generated from upstream kernel headers; I don't want to start making exceptions.
Is it just the xtables stuff (which has always been problematic)?
Quoted 19 lines · Stephen Hemminger
Quoted 7 lines · On Fri, 1 Dec 2017 13:04:51 +0200 Leon Romanovsky <[email protected]> wrote:
From: Leon Romanovsky <[email protected]>
Add
asm/posix_types.hheader file to the list of needed includes, because the headers files in RHEL 6.8 are too old and doesn't have declaration of__kernel_long_t.In file included from
../include/uapi/linux/kernel.h:5,Quoted 8 lines
from ../include/uapi/linux/netfilter/x_tables.h:4, from ../include/xtables.h:20, from em_ipset.c:26:
../include/uapi/linux/sysinfo.h:9: error: expected specifier-qualifier-list before ‘__kernel_long_t’Cc Riad Abo Raed <[email protected]>Cc Guy Ergas <[email protected]>Signed-off-by Leon Romanovsky <[email protected]>
Quoted 6 lines
I see the problem, but the solution of dragging in
posix_types.hwould be too much of a long term maintenance issue. All the headers in uapi are regularly generated from upstream kernel headers; I don't want to start making exceptions.Is it just the xtables stuff (which has always been problematic)?
Actually, the only place where __kernel_long_t and __kernel_ulong_t appear is struct sysinfo in include/uapi/linux/sysinfo.h and this structure isn't even used anywhere in iproute2 source (not even in the include/uapi/linux/kernel.h file which includes <linux/sysinfo.h>).
So one could work around the problem by defining _LINUX_SYSINFO_H but that seems a bit dirty hack.
Michal Kubecek
Quoted 27 lines · Michal Kubecek
Quoted 19 lines · Stephen Hemminger
Quoted 7 lines · On Fri, 1 Dec 2017 13:04:51 +0200 Leon Romanovsky <[email protected]> wrote:
From: Leon Romanovsky <[email protected]>
Add
asm/posix_types.hheader file to the list of needed includes, because the headers files in RHEL 6.8 are too old and doesn't have declaration of__kernel_long_t.In file included from
../include/uapi/linux/kernel.h:5,Quoted 8 lines
from ../include/uapi/linux/netfilter/x_tables.h:4, from ../include/xtables.h:20, from em_ipset.c:26:
../include/uapi/linux/sysinfo.h:9: error: expected specifier-qualifier-list before ‘__kernel_long_t’Cc Riad Abo Raed <[email protected]>Cc Guy Ergas <[email protected]>Signed-off-by Leon Romanovsky <[email protected]>Quoted 6 lines
I see the problem, but the solution of dragging in
posix_types.hwould be too much of a long term maintenance issue. All the headers in uapi are regularly generated from upstream kernel headers; I don't want to start making exceptions.Is it just the xtables stuff (which has always been problematic)?
Quoted 7 lines
Actually, the only place where
__kernel_long_tand__kernel_ulong_tappear is struct sysinfo ininclude/uapi/linux/sysinfo.hand this structure isn't even used anywhere in iproute2 source (not even in theinclude/uapi/linux/kernel.hfile which includes <linux/sysinfo.h>).So one could work around the problem by defining
_LINUX_SYSINFO_Hbut that seems a bit dirty hack.
It is too dirty :). It can cause to completely unpredictable compilation failures in the future, which won't be easy to track down.
Quoted 3 lines
Michal Kubecek
Quoted 19 lines · Stephen Hemminger
Quoted 7 lines · On Fri, 1 Dec 2017 13:04:51 +0200 Leon Romanovsky <[email protected]> wrote:
From: Leon Romanovsky <[email protected]>
Add
asm/posix_types.hheader file to the list of needed includes, because the headers files in RHEL 6.8 are too old and doesn't have declaration of__kernel_long_t.In file included from
../include/uapi/linux/kernel.h:5,Quoted 8 lines
from ../include/uapi/linux/netfilter/x_tables.h:4, from ../include/xtables.h:20, from em_ipset.c:26:
../include/uapi/linux/sysinfo.h:9: error: expected specifier-qualifier-list before ‘__kernel_long_t’Cc Riad Abo Raed <[email protected]>Cc Guy Ergas <[email protected]>Signed-off-by Leon Romanovsky <[email protected]>
Quoted 6 lines
I see the problem, but the solution of dragging in
posix_types.hwould be too much of a long term maintenance issue. All the headers in uapi are regularly generated from upstream kernel headers; I don't want to start making exceptions.Is it just the xtables stuff (which has always been problematic)?
Yes, both failures are related to xtables. And this wass my naive approach to solve first one, the second mentioned in the original commit log (missing xtables-version.h) is more harder to fix.
Will it work if I test in configure script the existence of __kernel_long_t and fallback to xt-internal.h?
Thanks
Quoted 27 lines · On Sat, 2 Dec 2017 10:28:33 +0200 Leon Romanovsky <[email protected]> wrote:
Quoted 19 lines · Stephen Hemminger
Quoted 7 lines · On Fri, 1 Dec 2017 13:04:51 +0200 Leon Romanovsky <[email protected]> wrote:
From: Leon Romanovsky <[email protected]>
Add
asm/posix_types.hheader file to the list of needed includes, because the headers files in RHEL 6.8 are too old and doesn't have declaration of__kernel_long_t.In file included from
../include/uapi/linux/kernel.h:5,Quoted 8 lines
from ../include/uapi/linux/netfilter/x_tables.h:4, from ../include/xtables.h:20, from em_ipset.c:26:
../include/uapi/linux/sysinfo.h:9: error: expected specifier-qualifier-list before ‘__kernel_long_t’Cc Riad Abo Raed <[email protected]>Cc Guy Ergas <[email protected]>Signed-off-by Leon Romanovsky <[email protected]>Quoted 6 lines
I see the problem, but the solution of dragging in
posix_types.hwould be too much of a long term maintenance issue. All the headers in uapi are regularly generated from upstream kernel headers; I don't want to start making exceptions.Is it just the xtables stuff (which has always been problematic)?
Quoted 8 lines
Yes, both failures are related to xtables. And this wass my naive approach to solve first one, the second mentioned in the original commit log (missing
xtables-version.h) is more harder to fix.Will it work if I test in configure script the existence of
__kernel_long_tand fallback toxt-internal.h?Thanks
Why not just modify the part of the configure script that checks if xtables build will work. It should fail if header files won't work.
Quoted 145 lines · On Fri, 1 Dec 2017 13:04:51 +0200 Leon Romanovsky <[email protected]> wrote:
From: Leon Romanovsky <[email protected]>
Add
asm/posix_types.hheader file to the list of needed includes, because the headers files in RHEL 6.8 are too old and doesn't have declaration of__kernel_long_t.In file included from
../include/uapi/linux/kernel.h:5,from ../include/uapi/linux/netfilter/x_tables.h:4, from ../include/xtables.h:20, from em_ipset.c:26:
../include/uapi/linux/sysinfo.h:9: error: expected specifier-qualifier-list before ‘__kernel_long_t’Cc Riad Abo Raed <[email protected]>Cc Guy Ergas <[email protected]>Signed-off-by Leon Romanovsky <[email protected]>---
Stephen,
I don't know how to properly solve this type of errors and would like to hear your guidance on it.Should I simply add kernel file? Or maybe I need to add
HAVE_xxxchecks to configure script to check__kernel_long_texistence and declare only this type?I also have another build error on RHEL 6.8 system and looking for a solution.
In file included from em_ipset.c:26:
../include/xtables.h:35:29: error:xtables-version.h: No such file or directory make[1]: *** [em_ipset.o] Error 1The iptables-devel is iptables-devel-1.4.7-16.el6.x86_64 so
check_xt()success, but RH headers don't havextable-version.hand the relevant defines are embedded in the mainxtables.hheader file.Thanks
--- include/uapi/asm/posix_types.h | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 include/uapi/asm/posix_types.hinclude/uapi/asm/posix_types.h new file +97
-1@@ -0,0 +1,97 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __ASM_GENERIC_POSIX_TYPES_H +#define __ASM_GENERIC_POSIX_TYPES_H + +#include <asm/bitsperlong.h> +/* +* This file is generally used by user-level software, so you need to +* be a little careful about namespace pollution etc. +* +* First the types that are often defined in different ways across +* architectures, so that you can override them. +*/ + +#ifndef __kernel_long_t +typedef long __kernel_long_t ; +typedef unsigned long __kernel_ulong_t ; +#endif + +#ifndef __kernel_ino_t +typedef __kernel_ulong_t __kernel_ino_t ; +#endif + +#ifndef __kernel_mode_t +typedef unsigned int __kernel_mode_t ; +#endif + +#ifndef __kernel_pid_t +typedef int __kernel_pid_t ; +#endif + +#ifndef __kernel_ipc_pid_t +typedef int __kernel_ipc_pid_t ; +#endif + +#ifndef __kernel_uid_t +typedef unsigned int __kernel_uid_t ; +typedef unsigned int __kernel_gid_t ; +#endif + +#ifndef __kernel_suseconds_t +typedef __kernel_long_t __kernel_suseconds_t ; +#endif + +#ifndef __kernel_daddr_t +typedef int __kernel_daddr_t ; +#endif + +#ifndef __kernel_uid32_t +typedef unsigned int __kernel_uid32_t ; +typedef unsigned int __kernel_gid32_t ; +#endif + +#ifndef __kernel_old_uid_t +typedef __kernel_uid_t __kernel_old_uid_t ; +typedef __kernel_gid_t __kernel_old_gid_t ; +#endif + +#ifndef __kernel_old_dev_t +typedef unsigned int __kernel_old_dev_t ; +#endif + +/* +* Most 32 bit architectures use "unsigned int" size_t, +* and all 64 bit architectures use "unsigned long" size_t. +*/ +#ifndef __kernel_size_t +#if __BITS_PER_LONG !=64 +typedef unsigned int __kernel_size_t ; +typedef int __kernel_ssize_t ; +typedef int __kernel_ptrdiff_t ; +#else +typedef __kernel_ulong_t __kernel_size_t ; +typedef __kernel_long_t __kernel_ssize_t ; +typedef __kernel_long_t __kernel_ptrdiff_t ; +#endif +#endif + +#ifndef __kernel_fsid_t +typedef struct { +int val[2 ]; +}__kernel_fsid_t ; +#endif + +/* +* anything below here should be completely generic +*/ +typedef __kernel_long_t __kernel_off_t ; +typedef long long __kernel_loff_t ; +typedef __kernel_long_t __kernel_time_t ; +typedef __kernel_long_t __kernel_clock_t ; +typedef int __kernel_timer_t ; +typedef int __kernel_clockid_t ; +typedef char *__kernel_caddr_t ; +typedef unsigned short __kernel_uid16_t ; +typedef unsigned short __kernel_gid16_t ; + +#endif /* __ASM_GENERIC_POSIX_TYPES_H */ --
Quoted 2 lines
2.15.1
This isn't going to be supportable. The headers in uapi are updated by a script from kernel, and this version posix_types.h conflicts with what the kernel creates by make headers_install.
Quoted 146 lines · Stephen Hemminger
Quoted 143 lines · On Fri, 1 Dec 2017 13:04:51 +0200 Leon Romanovsky <[email protected]> wrote:
From: Leon Romanovsky <[email protected]>
Add
asm/posix_types.hheader file to the list of needed includes, because the headers files in RHEL 6.8 are too old and doesn't have declaration of__kernel_long_t.In file included from
../include/uapi/linux/kernel.h:5,from ../include/uapi/linux/netfilter/x_tables.h:4, from ../include/xtables.h:20, from em_ipset.c:26:
../include/uapi/linux/sysinfo.h:9: error: expected specifier-qualifier-list before ‘__kernel_long_t’Cc Riad Abo Raed <[email protected]>Cc Guy Ergas <[email protected]>Signed-off-by Leon Romanovsky <[email protected]>---
Stephen,
I don't know how to properly solve this type of errors and would like to hear your guidance on it.Should I simply add kernel file? Or maybe I need to add
HAVE_xxxchecks to configure script to check__kernel_long_texistence and declare only this type?I also have another build error on RHEL 6.8 system and looking for a solution.
In file included from em_ipset.c:26:
../include/xtables.h:35:29: error:xtables-version.h: No such file or directory make[1]: *** [em_ipset.o] Error 1The iptables-devel is iptables-devel-1.4.7-16.el6.x86_64 so
check_xt()success, but RH headers don't havextable-version.hand the relevant defines are embedded in the mainxtables.hheader file.Thanks
--- include/uapi/asm/posix_types.h | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 include/uapi/asm/posix_types.hinclude/uapi/asm/posix_types.h new file +96
-0@@ -0,0 +1,97 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __ASM_GENERIC_POSIX_TYPES_H +#define __ASM_GENERIC_POSIX_TYPES_H + +#include <asm/bitsperlong.h> +/* +* This file is generally used by user-level software, so you need to +* be a little careful about namespace pollution etc. +* +* First the types that are often defined in different ways across +* architectures, so that you can override them. +*/ + +#ifndef __kernel_long_t +typedef long __kernel_long_t ; +typedef unsigned long __kernel_ulong_t ; +#endif + +#ifndef __kernel_ino_t +typedef __kernel_ulong_t __kernel_ino_t ; +#endif + +#ifndef __kernel_mode_t +typedef unsigned int __kernel_mode_t ; +#endif + +#ifndef __kernel_pid_t +typedef int __kernel_pid_t ; +#endif + +#ifndef __kernel_ipc_pid_t +typedef int __kernel_ipc_pid_t ; +#endif + +#ifndef __kernel_uid_t +typedef unsigned int __kernel_uid_t ; +typedef unsigned int __kernel_gid_t ; +#endif + +#ifndef __kernel_suseconds_t +typedef __kernel_long_t __kernel_suseconds_t ; +#endif + +#ifndef __kernel_daddr_t +typedef int __kernel_daddr_t ; +#endif + +#ifndef __kernel_uid32_t +typedef unsigned int __kernel_uid32_t ; +typedef unsigned int __kernel_gid32_t ; +#endif + +#ifndef __kernel_old_uid_t +typedef __kernel_uid_t __kernel_old_uid_t ; +typedef __kernel_gid_t __kernel_old_gid_t ; +#endif + +#ifndef __kernel_old_dev_t +typedef unsigned int __kernel_old_dev_t ; +#endif + +/* +* Most 32 bit architectures use "unsigned int" size_t, +* and all 64 bit architectures use "unsigned long" size_t. +*/ +#ifndef __kernel_size_t +#if __BITS_PER_LONG !=64 +typedef unsigned int __kernel_size_t ; +typedef int __kernel_ssize_t ; +typedef int __kernel_ptrdiff_t ; +#else +typedef __kernel_ulong_t __kernel_size_t ; +typedef __kernel_long_t __kernel_ssize_t ; +typedef __kernel_long_t __kernel_ptrdiff_t ; +#endif +#endif + +#ifndef __kernel_fsid_t +typedef struct { +int val[2 ]; +}__kernel_fsid_t ; +#endif + +/* +* anything below here should be completely generic +*/ +typedef __kernel_long_t __kernel_off_t ; +typedef long long __kernel_loff_t ; +typedef __kernel_long_t __kernel_time_t ; +typedef __kernel_long_t __kernel_clock_t ; +typedef int __kernel_timer_t ; +typedef int __kernel_clockid_t ; +typedef char *__kernel_caddr_t ; +typedef unsigned short __kernel_uid16_t ; +typedef unsigned short __kernel_gid16_t ; +
Quoted 8 lines
Quoted 4 lines
include/uapi/asm/posix_types.h new file +1
-1+#endif /* __ASM_GENERIC_POSIX_TYPES_H */ --2.15.1
This isn't going to be supportable. The headers in uapi are updated by a script from kernel, and this version
posix_types.hconflicts with what the kernel creates by makeheaders_install.
At the end, I gave up to fix compilation properly for RHEL 6.8. After I fixed posix_type and xt-tables, I discovered that glibc headers are not updated too (missing AF_VSOCK).
My dirty hack was to copy various headers to iproute2 so verification team can proceed with latest iproute2 on such platform was enough for them.
Thanks