diff options
authorJessica Clarke <jrtc27@FreeBSD.org>2021-01-23 20:59:15 +0000
committerJessica Clarke <jrtc27@FreeBSD.org>2021-01-23 20:59:15 +0000
commitd6327ae8c11b73765f100981baca49166b558b70 (patch)
parent0d528e6354141dd097f8719e858b3ae3686d2062 (diff)
Fix cross-build support for Ubuntu 16.04
Older glibc headers did some very nasty things that have since been sanitised. We could also fix this by adding a linux/getopt.h wrapper alongside the existing common/getopt.h that #undef's __need_getopt, but that seems a little more hacky and complicated. Reviewed by: arichardson
1 files changed, 9 insertions, 1 deletions
diff --git a/tools/build/cross-build/include/linux/unistd.h b/tools/build/cross-build/include/linux/unistd.h
index 9d1bd1bf4025..ea131f1ab732 100644
--- a/tools/build/cross-build/include/linux/unistd.h
+++ b/tools/build/cross-build/include/linux/unistd.h
@@ -41,9 +41,17 @@
/* Ensure that unistd.h pulls in getopt */
#define __USE_POSIX2
+ * Before version 2.25, glibc's unistd.h would define the POSIX subset of
+ * getopt.h by defining __need_getopt, including getopt.h (which would
+ * disable the header guard) and then undefining it so later including
+ * getopt.h explicitly would define the extensions. However, we wrap getopt,
+ * and so the wrapper's #pragma once breaks that. Thus getopt.h must be
+ * included before the real unistd.h to ensure we get all the extensions.
+ */
+#include <getopt.h>
#include_next <unistd.h>
#include <fcntl.h>
-#include <getopt.h>
#include <stdlib.h>
#include <string.h>
#include <sys/syscall.h>