reallocarray is non-standard but present in GLIBC and BSDs.
# directories in the source tree.
BASICS_DIR = $(CURDIR)/basics
BASICS_INC = $(BASICS_DIR)/include
-BASICS_LIBC_DIR = $(BASICS_DIR)/libc
-BASICS_CRT_SOURCES = $(wildcard $(BASICS_LIBC_DIR)/crt*.c)
-BASICS_LIBC_SOURCES = $(BASICS_LIBC_DIR)/string.c
+BASICS_CRT_SOURCES = $(wildcard $(BASICS_DIR)/crt/*.c)
+BASICS_SOURCES = $(wildcard $(BASICS_DIR)/sources/*.c)
DLMALLOC_DIR = $(CURDIR)/dlmalloc
DLMALLOC_SRC_DIR = $(DLMALLOC_DIR)/src
DLMALLOC_SOURCES = $(DLMALLOC_SRC_DIR)/dlmalloc.c
override WASM_CFLAGS += --sysroot="$(SYSROOT)"
objs = $(patsubst $(CURDIR)/%.c,$(OBJDIR)/%.o,$(1))
-override BASICS_LIBC_OBJS = $(call objs,$(BASICS_LIBC_SOURCES))
+override BASICS_OBJS = $(call objs,$(BASICS_SOURCES))
override DLMALLOC_OBJS = $(call objs,$(DLMALLOC_SOURCES))
override LIBC_BOTTOM_HALF_ALL_OBJS = $(call objs,$(LIBC_BOTTOM_HALF_ALL_SOURCES))
override LIBC_TOP_HALF_ALL_OBJS = $(call objs,$(LIBC_TOP_HALF_ALL_SOURCES))
-override LIBC_OBJS := $(BASICS_LIBC_OBJS)
+override LIBC_OBJS := $(BASICS_OBJS)
ifeq ($(BUILD_DLMALLOC),yes)
override LIBC_OBJS += $(DLMALLOC_OBJS)
endif
--- /dev/null
+extern void __wasm_call_ctors(void);
+extern int main(int, char *[]);
+extern void __prepare_for_exit(void);
+void _Exit(int) __attribute__((noreturn));
+
+void _start(void) {
+ /* The linker synthesizes this to call constructors. */
+ __wasm_call_ctors();
+
+ /* Call main with no arguments. */
+ int r = main(0, 0);
+
+ /* Call atexit functions, destructors, stdio cleanup, etc. */
+ __prepare_for_exit();
+
+ /* If main exited successfully, just return, otherwise call _Exit. */
+ if (r != 0) {
+ _Exit(r);
+ }
+}
void *calloc(size_t nmemb, size_t size) __attribute__((__malloc__, __warn_unused_result__));
void *realloc(void *ptr, size_t size) __attribute__((__warn_unused_result__));
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+void *reallocarray(void *, size_t, size_t) __attribute__((__warn_unused_result__));
+#endif
+
#ifdef __cplusplus
}
#endif
+++ /dev/null
-extern void __wasm_call_ctors(void);
-extern int main(int, char *[]);
-extern void __prepare_for_exit(void);
-void _Exit(int) __attribute__((noreturn));
-
-void _start(void) {
- /* The linker synthesizes this to call constructors. */
- __wasm_call_ctors();
-
- /* Call main with no arguments. */
- int r = main(0, 0);
-
- /* Call atexit functions, destructors, stdio cleanup, etc. */
- __prepare_for_exit();
-
- /* If main exited successfully, just return, otherwise call _Exit. */
- if (r != 0) {
- _Exit(r);
- }
-}
+++ /dev/null
-#include <string.h>
-#include <stdint.h>
-
-static void *copy_forward(void *restrict dst, const void *restrict src, size_t n) {
- char *d = (char *)dst;
- const char *s = (const char *)src;
- while (n-- != 0) {
- *d++ = *s++;
- }
- return dst;
-}
-
-static void *copy_backward(void *restrict dst, const void *restrict src, size_t n) {
- char *d = (char *)dst;
- const char *s = (const char *)src;
- d += n;
- s += n;
- while (n-- != 0) {
- *--d = *--s;
- }
- return dst;
-}
-
-void *memcpy(void *restrict dst, const void *restrict src, size_t n) {
- return copy_forward(dst, src, n);
-}
-
-void *memmove(void *dst, const void *src, size_t n) {
- if ((uintptr_t)dst - (uintptr_t)src >= n) {
- return copy_forward(dst, src, n);
- }
- return copy_backward(dst, src, n);
-}
-
-void *memset(void *restrict dst, int c, size_t n) {
- char *d = (char *)dst;
- while (n-- != 0) {
- *d++ = c;
- }
- return dst;
-}
--- /dev/null
+#include <stdlib.h>
+#include <errno.h>
+
+void *__reallocarray(void *ptr, size_t nmemb, size_t size) {
+ size_t bytes;
+ if (__builtin_umull_overflow(nmemb, size, &bytes)) {
+ errno = ENOMEM;
+ return NULL;
+ }
+ return realloc(ptr, bytes);
+}
+
+void *reallocarray(void *ptr, size_t nmemb, size_t size)
+ __attribute__((__weak__, __alias__("__reallocarray")));
--- /dev/null
+#include <string.h>
+#include <stdint.h>
+
+static void *copy_forward(void *restrict dst, const void *restrict src, size_t n) {
+ char *d = (char *)dst;
+ const char *s = (const char *)src;
+ while (n-- != 0) {
+ *d++ = *s++;
+ }
+ return dst;
+}
+
+static void *copy_backward(void *restrict dst, const void *restrict src, size_t n) {
+ char *d = (char *)dst;
+ const char *s = (const char *)src;
+ d += n;
+ s += n;
+ while (n-- != 0) {
+ *--d = *--s;
+ }
+ return dst;
+}
+
+void *memcpy(void *restrict dst, const void *restrict src, size_t n) {
+ return copy_forward(dst, src, n);
+}
+
+void *memmove(void *dst, const void *src, size_t n) {
+ if ((uintptr_t)dst - (uintptr_t)src >= n) {
+ return copy_forward(dst, src, n);
+ }
+ return copy_backward(dst, src, n);
+}
+
+void *memset(void *restrict dst, int c, size_t n) {
+ char *d = (char *)dst;
+ while (n-- != 0) {
+ *d++ = c;
+ }
+ return dst;
+}
__progname_full
__putenv
__rand48_step
+__reallocarray
__rem_pio2
__rem_pio2_large
__rem_pio2f
readlinkat
readv
realloc
+reallocarray
recv
regcomp
regerror