Index: kernel/generic/include/cc.h
===================================================================
--- kernel/generic/include/cc.h	(revision bcc20fa183d6812436bfd35b6b6ddc622e42bf25)
+++ kernel/generic/include/cc.h	(revision 6d5da743e8cc9688379b40af5c365b35719f5c63)
@@ -40,6 +40,9 @@
 #define ATTRIBUTE_OPTIMIZE(opt) \
 	__attribute__ ((optimize(opt)))
+#define ATTRIBUTE_USED \
+	__attribute__ ((used))
 #else
 #define ATTRIBUTE_OPTIMIZE(opt)
+#define ATTRIBUTE_USED
 #endif
 
Index: kernel/generic/include/lib/memfnc.h
===================================================================
--- kernel/generic/include/lib/memfnc.h	(revision bcc20fa183d6812436bfd35b6b6ddc622e42bf25)
+++ kernel/generic/include/lib/memfnc.h	(revision 6d5da743e8cc9688379b40af5c365b35719f5c63)
@@ -39,8 +39,14 @@
 #include <cc.h>
 
+#ifdef CONFIG_LTO
+#define DO_NOT_DISCARD ATTRIBUTE_USED
+#else
+#define DO_NOT_DISCARD
+#endif
+
 extern void *memset(void *, int, size_t)
-    ATTRIBUTE_OPTIMIZE("-fno-tree-loop-distribute-patterns");
+    ATTRIBUTE_OPTIMIZE("-fno-tree-loop-distribute-patterns") DO_NOT_DISCARD;
 extern void *memcpy(void *, const void *, size_t)
-    ATTRIBUTE_OPTIMIZE("-fno-tree-loop-distribute-patterns");
+    ATTRIBUTE_OPTIMIZE("-fno-tree-loop-distribute-patterns") DO_NOT_DISCARD;
 
 #endif
Index: kernel/generic/include/memstr.h
===================================================================
--- kernel/generic/include/memstr.h	(revision bcc20fa183d6812436bfd35b6b6ddc622e42bf25)
+++ kernel/generic/include/memstr.h	(revision 6d5da743e8cc9688379b40af5c365b35719f5c63)
@@ -37,4 +37,11 @@
 
 #include <typedefs.h>
+#include <cc.h>
+
+#ifdef CONFIG_LTO
+#define DO_NOT_DISCARD ATTRIBUTE_USED
+#else
+#define DO_NOT_DISCARD
+#endif
 
 #define memset(dst, val, cnt)  __builtin_memset((dst), (val), (cnt))
@@ -43,5 +50,5 @@
 extern void memsetb(void *, size_t, uint8_t);
 extern void memsetw(void *, size_t, uint16_t);
-extern void *memmove(void *, const void *, size_t);
+extern void *memmove(void *, const void *, size_t) DO_NOT_DISCARD;
 
 #endif
