#define GCOV_TAG_FUNCTION_LENGTH       3
 
+/* Since GCC 12.1 sizes are in BYTES and not in WORDS (4B). */
+#if (__GNUC__ >= 12)
+#define GCOV_UNIT_SIZE                         4
+#else
+#define GCOV_UNIT_SIZE                         1
+#endif
+
 static struct gcov_info *gcov_info_head;
 
 /**
        pos += store_gcov_u32(buffer, pos, info->version);
        pos += store_gcov_u32(buffer, pos, info->stamp);
 
+#if (__GNUC__ >= 12)
+       /* Use zero as checksum of the compilation unit. */
+       pos += store_gcov_u32(buffer, pos, 0);
+#endif
+
        for (fi_idx = 0; fi_idx < info->n_functions; fi_idx++) {
                fi_ptr = info->functions[fi_idx];
 
                /* Function record. */
                pos += store_gcov_u32(buffer, pos, GCOV_TAG_FUNCTION);
-               pos += store_gcov_u32(buffer, pos, GCOV_TAG_FUNCTION_LENGTH);
+               pos += store_gcov_u32(buffer, pos,
+                       GCOV_TAG_FUNCTION_LENGTH * GCOV_UNIT_SIZE);
                pos += store_gcov_u32(buffer, pos, fi_ptr->ident);
                pos += store_gcov_u32(buffer, pos, fi_ptr->lineno_checksum);
                pos += store_gcov_u32(buffer, pos, fi_ptr->cfg_checksum);
                        /* Counter record. */
                        pos += store_gcov_u32(buffer, pos,
                                              GCOV_TAG_FOR_COUNTER(ct_idx));
-                       pos += store_gcov_u32(buffer, pos, ci_ptr->num * 2);
+                       pos += store_gcov_u32(buffer, pos,
+                               ci_ptr->num * 2 * GCOV_UNIT_SIZE);
 
                        for (cv_idx = 0; cv_idx < ci_ptr->num; cv_idx++) {
                                pos += store_gcov_u64(buffer, pos,