diff --git a/cores/arduino/new b/cores/arduino/new
index 8cf21038e..8f2fa0e43 100644
--- a/cores/arduino/new
+++ b/cores/arduino/new
@@ -39,25 +39,25 @@ namespace std {
   using size_t = ::size_t;
 } // namespace std
 
-[[gnu::weak]] void * operator new(std::size_t size);
-[[gnu::weak]] void * operator new[](std::size_t size);
+void * operator new(std::size_t size);
+void * operator new[](std::size_t size);
 
-[[gnu::weak]] void * operator new(std::size_t size, const std::nothrow_t tag) noexcept;
-[[gnu::weak]] void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept;
+void * operator new(std::size_t size, const std::nothrow_t tag) noexcept;
+void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept;
 
 void * operator new(std::size_t size, void *place) noexcept;
 void * operator new[](std::size_t size, void *place) noexcept;
 
-[[gnu::weak]] void operator delete(void * ptr) noexcept;
-[[gnu::weak]] void operator delete[](void * ptr) noexcept;
+void operator delete(void * ptr) noexcept;
+void operator delete[](void * ptr) noexcept;
 
 #if __cplusplus >= 201402L
-[[gnu::weak]] void operator delete(void* ptr, std::size_t size) noexcept;
-[[gnu::weak]] void operator delete[](void * ptr, std::size_t size) noexcept;
+void operator delete(void* ptr, std::size_t size) noexcept;
+void operator delete[](void * ptr, std::size_t size) noexcept;
 #endif // __cplusplus >= 201402L
 
-[[gnu::weak]] void operator delete(void* ptr, const std::nothrow_t& tag) noexcept;
-[[gnu::weak]] void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept;
+void operator delete(void* ptr, const std::nothrow_t& tag) noexcept;
+void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept;
 
 void operator delete(void* ptr, void* place) noexcept;
 void operator delete[](void* ptr, void* place) noexcept;
diff --git a/cores/arduino/new.cpp b/cores/arduino/new.cpp
index 7ca493169..c024d1d7f 100644
--- a/cores/arduino/new.cpp
+++ b/cores/arduino/new.cpp
@@ -44,7 +44,7 @@ static void * new_helper(std::size_t size) {
   return malloc(size);
 }
 
-void * operator new(std::size_t size) {
+[[gnu::weak]] void * operator new(std::size_t size) {
   void *res = new_helper(size);
 #if defined(NEW_TERMINATES_ON_FAILURE)
   if (!res)
@@ -52,11 +52,11 @@ void * operator new(std::size_t size) {
 #endif
   return res;
 }
-void * operator new[](std::size_t size) {
+[[gnu::weak]] void * operator new[](std::size_t size) {
   return operator new(size);
 }
 
-void * operator new(std::size_t size, const std::nothrow_t tag) noexcept {
+[[gnu::weak]] void * operator new(std::size_t size, [[gnu::unused]] const std::nothrow_t tag) noexcept {
 #if defined(NEW_TERMINATES_ON_FAILURE)
   // Cannot call throwing operator new as standard suggests, so call
   // new_helper directly then
@@ -65,7 +65,7 @@ void * operator new(std::size_t size, const std::nothrow_t tag) noexcept {
   return operator new(size);
 #endif
 }
-void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept {
+[[gnu::weak]] void * operator new[](std::size_t size, [[gnu::unused]] const std::nothrow_t& tag) noexcept {
 #if defined(NEW_TERMINATES_ON_FAILURE)
   // Cannot call throwing operator new[] as standard suggests, so call
   // malloc directly then
@@ -84,26 +84,26 @@ void * operator new[](std::size_t size, void *place) noexcept {
   return operator new(size, place);
 }
 
-void operator delete(void * ptr) noexcept {
+[[gnu::weak]] void operator delete(void * ptr) noexcept {
   free(ptr);
 }
-void operator delete[](void * ptr) noexcept {
+[[gnu::weak]] void operator delete[](void * ptr) noexcept {
   operator delete(ptr);
 }
 
 #if __cplusplus >= 201402L
-void operator delete(void* ptr, std::size_t size) noexcept {
+[[gnu::weak]] void operator delete(void* ptr, std::size_t size) noexcept {
   operator delete(ptr);
 }
-void operator delete[](void * ptr, std::size_t size) noexcept {
+[[gnu::weak]] void operator delete[](void * ptr, std::size_t size) noexcept {
   operator delete[](ptr);
 }
 #endif // __cplusplus >= 201402L
 
-void operator delete(void* ptr, const std::nothrow_t& tag) noexcept {
+[[gnu::weak]] void operator delete(void* ptr, [[gnu::unused]] const std::nothrow_t& tag) noexcept {
   operator delete(ptr);
 }
-void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept {
+[[gnu::weak]] void operator delete[](void* ptr, [[gnu::unused]] const std::nothrow_t& tag) noexcept {
   operator delete[](ptr);
 }