GCC optimizes the use of `memcmp()` if the `-ffreestanding` flag is
missing. In the current configuration, the flag is missing for GCC <= 9.
The resulting optimization causes in an infinite loop for `lib/nolibc`.
This commit fixes the issue by adding the `-ffreestanding` flag for
`lib/nolibc`, irrespective of the GCC version.
GitHub-Fixes: #728
Signed-off-by: Razvan Deaconescu <razvand@unikraft.io>
Reviewed-by: Maria Sfiraiala <maria.sfiraiala@gmail.com>
Reviewed-by: Eduard Vintilă <eduard.vintila47@gmail.com>
Reviewed-by: Marco Schlumpp <marco@unikraft.io>
Approved-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io>
Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #740
COMPFLAGS-$(call gcc_version_ge,6,1) += -fno-PIC
LDFLAGS-$(call gcc_version_ge,6,1) += -no-pie
ifeq ($(call gcc_version_ge,10,0),y)
-COMPFLAGS-y += -fhosted -ffreestanding -fno-tree-loop-distribute-patterns
+COMPFLAGS-y += -fhosted -fno-tree-loop-distribute-patterns
LIBLDFLAGS-$(CONFIG_OPTIMIZE_LTO) += -flinker-output=nolto-rel
LDFLAGS-$(CONFIG_OPTIMIZE_LTO) += -flinker-output=nolto-rel
endif
CFLAGS-$(CONFIG_LIBNOLIBC) += $(LIBNOLIBC_NO_BUILTINS)
CXXFLAGS-$(CONFIG_LIBNOLIBC) += $(LIBNOLIBC_NO_BUILTINS)
+LIBNOLIBC_CFLAGS-y += -ffreestanding
+
LIBNOLIBC_GLOBAL_INCLUDES-y += -I$(LIBNOLIBC_BASE)/include
LIBNOLIBC_GLOBAL_INCLUDES-y += -I$(LIBNOLIBC_BASE)/arch/$(ARCH)
LIBNOLIBC_GLOBAL_INCLUDES-y += -I$(LIBNOLIBC_BASE)/musl-imported/include