diff --git a/py/mpconfig.h b/py/mpconfig.h
index 0dd84d1f810e40e6bc8e07bfd059fd2bfa6c5d32..3a9d342ea3e17f55e7219be482fc2e199d6bafb4 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -404,3 +404,8 @@ typedef double mp_float_t;
 #ifndef NORETURN
 #define NORETURN __attribute__((noreturn))
 #endif
+
+// Modifier for weak functions
+#ifndef MP_WEAK
+#define MP_WEAK __attribute__((weak))
+#endif
diff --git a/stmhal/main.c b/stmhal/main.c
index d6c12602e001ae360b9e617f5351d75a2ccaebdc..0cad768adbe1f2f93a3bd681b0a13cb00844ab75 100644
--- a/stmhal/main.c
+++ b/stmhal/main.c
@@ -86,7 +86,7 @@ void flash_error(int n) {
     led_state(PYB_LED_R2, 0);
 }
 
-void __fatal_error(const char *msg) {
+void NORETURN __fatal_error(const char *msg) {
     for (volatile uint delay = 0; delay < 10000000; delay++) {
     }
     led_state(1, 1);
@@ -112,8 +112,7 @@ void nlr_jump_fail(void *val) {
 }
 
 #ifndef NDEBUG
-void __attribute__((weak))
-    __assert_func(const char *file, int line, const char *func, const char *expr) {
+void MP_WEAK __assert_func(const char *file, int line, const char *func, const char *expr) {
     (void)func;
     printf("Assertion '%s' failed, at file %s:%d\n", expr, file, line);
     __fatal_error("");