package/uclibc: add patch to fix reallocarray() definition
uClibc-ng unconditionally exposes a reallocarray() prototype, but only
provides the implementation when the malloc-standard implementation is
selected in the configuration.
As noMMU configurations can't use malloc-standard, they use malloc or
malloc-simple that don't provide reallocarray().
As a result of reallocarray() being missing, some packages such as
util-linux provide their own replacement implementation... but its
prototype clashes with the one provided by uClibc, causing build
failures such as:
In file included from lib/color-names.c:7:
./include/c.h:586:21: error: static declaration of ‘reallocarray’ follows non-static declaration
586 | static inline void *reallocarray(void *ptr, size_t nmemb, size_t size)
| ^~~~~~~~~~~~
In file included from ./include/c.h:16:
/home/thomas/projets/buildroot/output/host/arm-buildroot-uclinux-uclibcgnueabi/sysroot/usr/include/stdlib.h:898:14: note: previous declaration of ‘reallocarray’ with type ‘void *(void *, size_t, size_t)’ {aka ‘void *(void *, unsigned int, unsigned int)’}
898 | extern void *reallocarray (void *__ptr, size_t __m, size_t __n);
| ^~~~~~~~~~~~
make[3]: *** [Makefile:12354: lib/libtcolors_la-color-names.lo] Error 1
This is addressed by a patch on uClibc, submitted upstream, which
makes sure the prototype is only exposed when the implementation is
provided.
The issue can be reproduced with commands:
cat <<EOF >.config
BR2_arm=y
BR2_cortex_m4=y
BR2_TOOLCHAIN_BUILDROOT_UCLIBC=y
BR2_PACKAGE_UTIL_LINUX=y
BR2_PACKAGE_UTIL_LINUX_KILL=y
EOF
make olddefconfig
make util-linux
Fixes:
https://autobuild.buildroot.net/results/157aa82aa4cd57eacc4defe6cace16e464261e9a/ (RISC-V noMMU)
https://autobuild.buildroot.net/results/ce1a24c1465b82686ae375ac688a553fb65df5ea/ (ARM noMMU)
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
[Julien: add commands to reproduce the issue in commit log]
Signed-off-by: Julien Olivain <ju.o@free.fr>
This commit is contained in:
committed by
Julien Olivain
parent
34424432ba
commit
01895663d3
@@ -0,0 +1,64 @@
|
||||
From bbb1a4f197624b0040e3228505eb2a725a8846f8 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
|
||||
Date: Thu, 3 Apr 2025 22:56:49 +0200
|
||||
Subject: [PATCH] include/stdlib.h: only expose reallocarray() prototype when
|
||||
implementation is available
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The reallocarray() primitive is only provided by the malloc-standard
|
||||
implementation: neither malloc nor malloc-simple provide it. This
|
||||
causes issues when building for example util-linux on noMMU platforms
|
||||
as:
|
||||
|
||||
- noMMU platforms can't use malloc-standard, so either malloc or
|
||||
malloc-simple are used, which means reallocarray() is not
|
||||
implemented
|
||||
|
||||
- util-linux detects the absence of reallocarray(), and provides its
|
||||
own implementation, but the prototype clashes with the prototype in
|
||||
uClibc's <stdlib.h>
|
||||
|
||||
The combination of which causes the following build failure:
|
||||
|
||||
In file included from lib/color-names.c:7:
|
||||
./include/c.h:586:21: error: static declaration of ‘reallocarray’ follows non-static declaration
|
||||
586 | static inline void *reallocarray(void *ptr, size_t nmemb, size_t size)
|
||||
| ^~~~~~~~~~~~
|
||||
In file included from ./include/c.h:16:
|
||||
/home/thomas/projets/buildroot/output/host/arm-buildroot-uclinux-uclibcgnueabi/sysroot/usr/include/stdlib.h:898:14: note: previous declaration of ‘reallocarray’ with type ‘void *(void *, size_t, size_t)’ {aka ‘void *(void *, unsigned int, unsigned int)’}
|
||||
898 | extern void *reallocarray (void *__ptr, size_t __m, size_t __n);
|
||||
| ^~~~~~~~~~~~
|
||||
make[3]: *** [Makefile:12354: lib/libtcolors_la-color-names.lo] Error 1
|
||||
|
||||
To fix this, let's not expose the prototype of reallocarray() if we
|
||||
don't provide the implementation for it.
|
||||
|
||||
Upstream: https://mailman.openadk.org/mailman3/hyperkitty/list/devel@uclibc-ng.org/thread/BX4ENNZYO23YQJQF5XITW7TETSJHEFK5/
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
|
||||
---
|
||||
include/stdlib.h | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/include/stdlib.h b/include/stdlib.h
|
||||
index d4e0b75e7..448c5e336 100644
|
||||
--- a/include/stdlib.h
|
||||
+++ b/include/stdlib.h
|
||||
@@ -986,9 +986,13 @@ extern int getpt (void);
|
||||
extern int getloadavg (double __loadavg[], int __nelem)
|
||||
__THROW __nonnull ((1));
|
||||
|
||||
+/* reallocarray() only provided by the malloc-standard implementation */
|
||||
+#if defined(__MALLOC_STANDARD__)
|
||||
extern void *reallocarray (void *__ptr, size_t __m, size_t __n);
|
||||
#endif
|
||||
|
||||
+#endif
|
||||
+
|
||||
#ifdef _LIBC
|
||||
extern int __drand48_iterate (unsigned short int xsubi[3], struct drand48_data *buffer) attribute_hidden;
|
||||
|
||||
--
|
||||
2.48.1
|
||||
|
||||
Reference in New Issue
Block a user