diff --git a/utils.c b/utils.c
index 3f008df325cdb68fcc4c85d3a2e844c9c17ff95f..985173e7b799dff9cc5b689754b11fd1cd69dd6a 100644
--- a/utils.c
+++ b/utils.c
@@ -959,10 +959,17 @@ mount_strerror (int errsv)
 static size_t
 xadd (size_t a, size_t b)
 {
+#if defined(__GNUC__) && __GNUC__ >= 5
   size_t result;
   if (__builtin_add_overflow (a, b, &result))
     die_oom ();
   return result;
+#else
+  if (a > SIZE_MAX - b)
+    die_oom ();
+
+  return a + b;
+#endif
 }
 
 /*
@@ -972,10 +979,17 @@ xadd (size_t a, size_t b)
 static size_t
 xmul (size_t a, size_t b)
 {
+#if defined(__GNUC__) && __GNUC__ >= 5
   size_t result;
   if (__builtin_mul_overflow (a, b, &result))
     die_oom ();
   return result;
+#else
+  if (b != 0 && a > SIZE_MAX / b)
+    die_oom ();
+
+  return a * b;
+#endif
 }
 
 void