From: Ammar Faizi <ammarfaizi2@xxxxxxxxxxx> liburing has its own memset() in nolibc.c. liburing nolibc can be linked to apps that use libc. libc has an optimized version of memset() function. Alviro reports that he found the memset() from liburing replaces the optimized memset() from libc when he compiled liburing statically. A simple reproducer: #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { static const size_t len = 1024ul 1024ul 1024ul * 4ul; char *p; p = malloc(len); __asm__ volatile ("":"+m"(p)); memset(p, 0, len); __asm__ volatile ("":"+m"(p)); return 0; } Compile liburing with: # Build liburing nolibc. ./configure --nolibc; make -j8; # Without liburing, memset() comes from libc (good) gcc x.c -o x; objdump -d x; # With liburing.a, memset() comes from liburing (bad) gcc x.c -o x src/liburing.a; objdump -d x; When we statically link liburing, the linker will choose the statically linked memset() over the dynamically linked memset() that the libc provides. Change the function name to __uring_memset() and define a macro memset() as: #define memset(PTR, C, LEN) __uring_memset(PTR, C, LEN) when CONFIG_NOLIBC is enabled so we don't have to touch the callers. Fixes: f48ee3168cdc325233825603269f304d348d323c ("Add nolibc build support") Reported-by: Alviro Iskandar Setiawan <alviro.iskandar@xxxxxxxxxxx> Signed-off-by: Ammar Faizi <ammarfaizi2@xxxxxxxxxxx> --- src/lib.h | 5 +++++ src/nolibc.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lib.h b/src/lib.h index f347191..5a9b87c 100644 --- a/src/lib.h +++ b/src/lib.h @@ -37,6 +37,7 @@ #define __hot __attribute__((__hot__)) #define __cold __attribute__((__cold__)) +void *__uring_memset(void *s, int c, size_t n); void *__uring_malloc(size_t len); void __uring_free(void *p); @@ -58,4 +59,8 @@ static inline void uring_free(void *ptr) #endif } +#ifdef CONFIG_NOLIBC +#define memset(PTR, C, LEN) __uring_memset(PTR, C, LEN) +#endif + #endif /* #ifndef LIBURING_LIB_H */ diff --git a/src/nolibc.c b/src/nolibc.c index 9a04ead..3207e33 100644 --- a/src/nolibc.c +++ b/src/nolibc.c @@ -7,7 +7,7 @@ #include "lib.h" #include "syscall.h" -void *memset(void *s, int c, size_t n) +void *__uring_memset(void *s, int c, size_t n) { size_t i; unsigned char *p = s; -- Ammar Faizi