From: Nadav Har'El <n...@scylladb.com>
Committer: Nadav Har'El <n...@scylladb.com>
Branch: master

lzloader: fix memset() implementation

Some compilers apparently optimize code in fastlz/ to call memset(), so
the uncompressing boot loader, fastlz/lzloader.cc, needs to implement
this function. The current implementation called the "builtin" memset,
which, if you look at the compilation result, actually calls memset()
and results in endless recursion and a hanging boot... This started
happening on Fedora 32 with Gcc 10, for example.

So let's implement memset() using the base_memset() we already have in
libc/string/memset.c.

Fixes #1084.

Signed-off-by: Nadav Har'El <n...@scylladb.com>

---
diff --git a/fastlz/lzloader.cc b/fastlz/lzloader.cc
--- a/fastlz/lzloader.cc
+++ b/fastlz/lzloader.cc
@@ -21,11 +21,16 @@ extern char _binary_loader_stripped_elf_lz_start;
 extern char _binary_loader_stripped_elf_lz_end;
 extern char _binary_loader_stripped_elf_lz_size;
 
-// std libraries used by fastlz.
-extern "C" void *memset(void *s, int c, size_t n)
-{
-    return __builtin_memset(s, c, n);
-}
+// The code in fastlz.cc does not call memset(), but some version of gcc
+// implement some assignments by calling memset(), so we need to implement
+// a memset() function. This is not performance-critical so let's stick to
+// the basic implementation we have in libc/string/memset.c. To avoid
+// compiling this source file a second time (the loader needs different
+// compile parameters), we #include it here instead.
+extern "C" void *memset(void *s, int c, size_t n);
+#define memset_base memset
+#include "libc/string/memset.c"
+#undef memset_base
 
 extern "C" void uncompress_loader()
 {

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to osv-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/000000000000d8f58e05a66764fd%40google.com.

Reply via email to