-ffreestanding typically inhibits "libcall optimizations" where calls to certain library functions can be replaced by the compiler in certain cases to calls to other library functions that may be more efficient. This can be problematic for embedded targets that don't provide full libc implementations. -ffreestanding inhibits all such optimizations, which is the safe choice, but generally we want the optimizations that are performed. The Linux kernel does implement a fair amount of libc routines. Instead of -ffreestanding (which makes more sense in smaller images like kexec's purgatory image), prefer -fno-builtin-* flags to disable the compiler from emitting calls to functions which may not be defined. If you see a linkage failure due to a missing symbol that's typically defined in a libc, and not explicitly called from the source code, then the compiler may have done such a transform. You can either implement such a function (ie. in lib/string.c) or disable the transform outright via -fno-builtin-* flag (where * is the name of the library routine, ie. -fno-builtin-bcmp). Patch 1 unbreaks the build with ToT clang, which has been red all weekend, by adding -fno-builtin-stpcpy. Patch 2 is a revert but adds -fno-builtin-bcmp. Patch 3 does the same for x86 purgatory. Patch 4 removes -ffreestanding from i386. The first patch makes sense for Kbuild, the second maybe akpm@, the third and forth for x86. Not sure who should pick up the series (they can be merged out of order, technically) but I really need the first patch soon. The 3 latter patches are cleanups. Nick Desaulniers (4): Makefile: add -fno-builtin-stpcpy Revert "lib/string.c: implement a basic bcmp" x86/boot: use -fno-builtin-bcmp x86: don't build CONFIG_X86_32 as -ffreestanding Makefile | 7 +++++++ arch/x86/Makefile | 3 --- arch/x86/boot/Makefile | 1 + arch/x86/boot/string.c | 8 -------- include/linux/string.h | 3 --- lib/string.c | 20 -------------------- 6 files changed, 8 insertions(+), 34 deletions(-) -- 2.28.0.220.ged08abb693-goog