package/gcc: fix build with BR2_TIME_BITS_64=y

On the architectures that supports libsanitizer (part of gcc), the
build is currently failing with BR2_TIME_BITS_64=y. This is because
some code in libsanitizer unsets _FILE_OFFSET_BITS, but building code
with _FILE_OFFSET_BITS unset, but _TIME_BITS set isn't legal.

To fix this, this commit backports two changes:

- One change to also unset _TIME_BITS in
  sanitizer_platform_limits_posix.cpp. This change is upstream in
  LLVM, and already part of GCC 14.x, so we only bringing it to GCC
  12.x and GCC 13.x.

- A second change doing the same modification, but in
  sanitizer_procmaps_solaris.cpp, which as crazy as it might sound,
  also gets compiled on Linux platforms (but to basically an empty
  file). This change has been submitted upstream to both LLVM and gcc.

Notes:

 - the special PowerPC SPE version of GCC cannot be affected, as only
   uClibc-ng is used for this architecture, and uClibc-ng doesn't use
   _TIME_BITS=64 (but now default to 64-bit time_t on 32-bit
   architectures, like musl does).

 - the special ARC version doesn't need patching because libsanitizer
   doesn't support the ARC architecture, so it doesn't get built

Fixes:

  http://autobuild.buildroot.net/results/ff2dbfdabf0bb6a0d82ea8a80122ab97fd75bd3f/
  https://gitlab.com/buildroot.org/buildroot/-/issues/16

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
This commit is contained in:
Thomas Petazzoni 2024-07-19 23:03:24 +02:00
parent 01becc082d
commit 81a4b6e7b8
5 changed files with 247 additions and 0 deletions

View File

@ -0,0 +1,44 @@
From e45f12ecf703eed45515d451cf014fba32e7410b Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Fri, 3 Feb 2023 11:48:35 -0800
Subject: [PATCH] Undef _TIME_BITS along with _FILE_OFFSET_BITS on Linux
On 32-bit glibc>=2.34 systems using 64bit time_t build fails because
_FILE_OFFSET_BITS is undefined here but _TIME_BITS is still set to 64
Fixes
```
/usr/include/features-time64.h:26:5: error: "_TIME_BITS=64 is allowed
only with _FILE_OFFSET_BITS=64"
| # error "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
| ^
| 1 error generated.
```
Reviewed By: thesamesam, MaskRay
Differential Revision: https://reviews.llvm.org/D140812
Upstream: https://github.com/llvm/llvm-project/commit/26800a2c7e7996dc773b4e990dd5cca41c45e1a9
Upstream: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=d53b3d94aaf211ffb2159614f5aaaf03ceb861cc
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
---
.../sanitizer_common/sanitizer_platform_limits_posix.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
index bfdccd5df07..4cedcbfb4bf 100644
--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -18,6 +18,7 @@
// depends on _FILE_OFFSET_BITS setting.
// To get this "true" dirent definition, we undefine _FILE_OFFSET_BITS below.
#undef _FILE_OFFSET_BITS
+#undef _TIME_BITS
#endif
// Must go after undef _FILE_OFFSET_BITS.
--
2.45.2

View File

@ -0,0 +1,53 @@
From 940a0c955bca98aba937c4bfe3fe4a4c17dddb85 Mon Sep 17 00:00:00 2001
From: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Date: Thu, 18 Jul 2024 23:13:41 +0200
Subject: [PATCH] libsanitizer: also undef _TIME_BITS in
sanitizer_procmaps_solaris.cpp
Upstream commit
https://github.com/llvm/llvm-project/commit/26800a2c7e7996dc773b4e990dd5cca41c45e1a9
of LLVM added a #undef _TIME_BITS in
libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp to
fix the build on 32-bit Linux platforms that have enabled 64-bit
time_t using _TIME_BITS=64.
Indeed, _TIME_BITS=64 can only be used when _FILE_OFFSET_BITS=64, but
sanitizer_platform_limits_posix.cpp undefines _FILE_OFFSET_BITS before
including any header file. To fix this, the upstream fix was to also
undef _TIME_BITS.
This commit simply does the same in sanitizer_procmaps_solaris.cpp,
which also gets compiled under Linux (despite what the file name
says). In practice on Linux hosts (where _TIME_BITS=64 matters),
sanitizer_procmaps_solaris.cpp will expand to nothing, as pretty much
the rest of the file is inside a #ifdef SANITIZER_SOLARIS...#endif. So
the #undef _FILE_OFFSET_BITS and #undef _TIME_BITS are only here
before including sanitizer_platform.h, which will set the
SANITIZER_LINUX/SANITIZER_SOLARIS define depending on the platform.
Fixes:
armeb-buildroot-linux-gnueabi/sysroot/usr/include/features-time64.h:26:5: error: #error "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
26 | # error "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
Upstream: https://gcc.gnu.org/pipermail/gcc-patches/2024-July/657811.html
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
---
libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp b/libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp
index e16c4e938cb..ca88cf2c2df 100644
--- a/libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp
+++ b/libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp
@@ -11,6 +11,7 @@
// Before Solaris 11.4, <procfs.h> doesn't work in a largefile environment.
#undef _FILE_OFFSET_BITS
+#undef _TIME_BITS
#include "sanitizer_platform.h"
#if SANITIZER_SOLARIS
#include "sanitizer_common.h"
--
2.45.2

View File

@ -0,0 +1,44 @@
From 88b73eedcfa0fc58aee2555377e6f7d4de153282 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Fri, 3 Feb 2023 11:48:35 -0800
Subject: [PATCH] Undef _TIME_BITS along with _FILE_OFFSET_BITS on Linux
On 32-bit glibc>=2.34 systems using 64bit time_t build fails because
_FILE_OFFSET_BITS is undefined here but _TIME_BITS is still set to 64
Fixes
```
/usr/include/features-time64.h:26:5: error: "_TIME_BITS=64 is allowed
only with _FILE_OFFSET_BITS=64"
| # error "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
| ^
| 1 error generated.
```
Reviewed By: thesamesam, MaskRay
Differential Revision: https://reviews.llvm.org/D140812
Upstream: https://github.com/llvm/llvm-project/commit/26800a2c7e7996dc773b4e990dd5cca41c45e1a9
Upstream: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=d53b3d94aaf211ffb2159614f5aaaf03ceb861cc
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
---
.../sanitizer_common/sanitizer_platform_limits_posix.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
index bcbd143d19d..1b23898b374 100644
--- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -18,6 +18,7 @@
// depends on _FILE_OFFSET_BITS setting.
// To get this "true" dirent definition, we undefine _FILE_OFFSET_BITS below.
#undef _FILE_OFFSET_BITS
+#undef _TIME_BITS
#endif
// Must go after undef _FILE_OFFSET_BITS.
--
2.45.2

View File

@ -0,0 +1,53 @@
From 7ad54084a2c07cca6d03dfe274893e903852d359 Mon Sep 17 00:00:00 2001
From: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Date: Thu, 18 Jul 2024 23:13:41 +0200
Subject: [PATCH] libsanitizer: also undef _TIME_BITS in
sanitizer_procmaps_solaris.cpp
Upstream commit
https://github.com/llvm/llvm-project/commit/26800a2c7e7996dc773b4e990dd5cca41c45e1a9
of LLVM added a #undef _TIME_BITS in
libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp to
fix the build on 32-bit Linux platforms that have enabled 64-bit
time_t using _TIME_BITS=64.
Indeed, _TIME_BITS=64 can only be used when _FILE_OFFSET_BITS=64, but
sanitizer_platform_limits_posix.cpp undefines _FILE_OFFSET_BITS before
including any header file. To fix this, the upstream fix was to also
undef _TIME_BITS.
This commit simply does the same in sanitizer_procmaps_solaris.cpp,
which also gets compiled under Linux (despite what the file name
says). In practice on Linux hosts (where _TIME_BITS=64 matters),
sanitizer_procmaps_solaris.cpp will expand to nothing, as pretty much
the rest of the file is inside a #ifdef SANITIZER_SOLARIS...#endif. So
the #undef _FILE_OFFSET_BITS and #undef _TIME_BITS are only here
before including sanitizer_platform.h, which will set the
SANITIZER_LINUX/SANITIZER_SOLARIS define depending on the platform.
Fixes:
armeb-buildroot-linux-gnueabi/sysroot/usr/include/features-time64.h:26:5: error: #error "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
26 | # error "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
Upstream: https://gcc.gnu.org/pipermail/gcc-patches/2024-July/657811.html
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
---
libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp b/libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp
index eeb49e2afe3..1b23fd4d512 100644
--- a/libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp
+++ b/libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp
@@ -11,6 +11,7 @@
// Before Solaris 11.4, <procfs.h> doesn't work in a largefile environment.
#undef _FILE_OFFSET_BITS
+#undef _TIME_BITS
#include "sanitizer_platform.h"
#if SANITIZER_SOLARIS
# include <fcntl.h>
--
2.45.2

View File

@ -0,0 +1,53 @@
From 71de45698f60f8feabc0e91336f1e2fb387902df Mon Sep 17 00:00:00 2001
From: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Date: Thu, 18 Jul 2024 23:13:41 +0200
Subject: [PATCH] libsanitizer: also undef _TIME_BITS in
sanitizer_procmaps_solaris.cpp
Upstream commit
https://github.com/llvm/llvm-project/commit/26800a2c7e7996dc773b4e990dd5cca41c45e1a9
of LLVM added a #undef _TIME_BITS in
libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp to
fix the build on 32-bit Linux platforms that have enabled 64-bit
time_t using _TIME_BITS=64.
Indeed, _TIME_BITS=64 can only be used when _FILE_OFFSET_BITS=64, but
sanitizer_platform_limits_posix.cpp undefines _FILE_OFFSET_BITS before
including any header file. To fix this, the upstream fix was to also
undef _TIME_BITS.
This commit simply does the same in sanitizer_procmaps_solaris.cpp,
which also gets compiled under Linux (despite what the file name
says). In practice on Linux hosts (where _TIME_BITS=64 matters),
sanitizer_procmaps_solaris.cpp will expand to nothing, as pretty much
the rest of the file is inside a #ifdef SANITIZER_SOLARIS...#endif. So
the #undef _FILE_OFFSET_BITS and #undef _TIME_BITS are only here
before including sanitizer_platform.h, which will set the
SANITIZER_LINUX/SANITIZER_SOLARIS define depending on the platform.
Fixes:
armeb-buildroot-linux-gnueabi/sysroot/usr/include/features-time64.h:26:5: error: #error "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
26 | # error "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
Upstream: https://gcc.gnu.org/pipermail/gcc-patches/2024-July/657811.html
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
---
libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp b/libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp
index eeb49e2afe3..1b23fd4d512 100644
--- a/libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp
+++ b/libsanitizer/sanitizer_common/sanitizer_procmaps_solaris.cpp
@@ -11,6 +11,7 @@
// Before Solaris 11.4, <procfs.h> doesn't work in a largefile environment.
#undef _FILE_OFFSET_BITS
+#undef _TIME_BITS
#include "sanitizer_platform.h"
#if SANITIZER_SOLARIS
# include <fcntl.h>
--
2.45.2