diff --git a/tools/include/nolibc/compiler.h b/tools/include/nolibc/compiler.h
index 3a1d5b8d4fb99595638fe3002a68939bff58d79e..9bc6a706a332378e5af1f5baabf953f137f99749 100644
--- a/tools/include/nolibc/compiler.h
+++ b/tools/include/nolibc/compiler.h
@@ -12,8 +12,13 @@
 #  define __nolibc_has_attribute(attr) 0
 #endif
 
-#define __nolibc_entrypoint __attribute__((optimize("Os", "omit-frame-pointer")))
-#define __nolibc_entrypoint_epilogue() __builtin_unreachable()
+#if __nolibc_has_attribute(naked)
+#  define __nolibc_entrypoint __attribute__((naked))
+#  define __nolibc_entrypoint_epilogue()
+#else
+#  define __nolibc_entrypoint __attribute__((optimize("Os", "omit-frame-pointer")))
+#  define __nolibc_entrypoint_epilogue() __builtin_unreachable()
+#endif /* __nolibc_has_attribute(naked) */
 
 #if defined(__SSP__) || defined(__SSP_STRONG__) || defined(__SSP_ALL__) || defined(__SSP_EXPLICIT__)