diff --git a/src/libcamera/base/object.cpp b/src/libcamera/base/object.cpp
index ec5b55d125d1..92cecd22fbe9 100644
--- a/src/libcamera/base/object.cpp
+++ b/src/libcamera/base/object.cpp
@@ -189,7 +189,11 @@ void Object::message(Message *msg)
 {
 	switch (msg->type()) {
 	case Message::InvokeMessage: {
-		InvokeMessage *iMsg = static_cast<InvokeMessage *>(msg);
+		/*
+		 * A static_cast should be enough, but gcc 10 and 11 choke on
+		 * it in release mode (with -O2 or -O3).
+		 */
+		InvokeMessage *iMsg = dynamic_cast<InvokeMessage *>(msg);
 		Semaphore *semaphore = iMsg->semaphore();
 		iMsg->invoke();
 
