No .noinit section in Minima

For a number of reasons I have been using the attribute ((section(".noinit"))) declaration in many sketches.
Actually, when using the UNO Minima the compiler still accepts that declaration but simply ignores it. The only work-around is using the EEPROM which will work for a while. Is there any better solution?
Check it out:

float pi __attribute__ ((section(".noinit")));
byte keepMyValue __attribute__ ((section(".noinit")));

void setup() {
  Serial.begin(9600);
  if (pi != PI) {
    /*
      cold-start detected
      this code is only executed
      after power-up
    */
    keepMyValue = 1;
    // next start will be NO coldstart
    pi = PI;
  }
  else keepMyValue++;
  /*
    Even (re)opening the Serial monitor
    will increase keepMyValue.
    On each start the number of flashes
    of the LED will be one higher.
    On UPLOAD keepMyValue gets incremented 
    twice.
  */
  Serial.println(keepMyValue);
  pinMode(LED_BUILTIN, OUTPUT);
  for (int i = 0; i < keepMyValue; i++) {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
  }
}

void loop() {}

The .noinit sections are correctly included in the binary:

Variables decorated with the .noinit section attribute are indeed included in that section, as can be verified using the following program:

extern const uintptr_t __noinit_start;
extern const uintptr_t __noinit_end;

[[gnu::section(".noinit")]] uint32_t keepMyValue = 0xDEADBEEF;

void consume(uintptr_t v) {
  asm volatile("" : : "r,m"(v) : "memory");
}

void setup() {
  consume(__noinit_start);
  consume(__noinit_end);
  consume(reinterpret_cast<uintptr_t>(&keepMyValue));
}

void loop() {}

arm-none-eabi-objdump --disassemble=setup --demangle sketch.ino.elf

Disassembly of section .text:

00004100 <setup>:
    4100:	4b01      	ldr	r3, [pc, #4]	@ (4108 <setup+0x8>)
    4102:	4b02      	ldr	r3, [pc, #8]	@ (410c <setup+0xc>)
    4104:	4b02      	ldr	r3, [pc, #8]	@ (4110 <setup+0x10>)
    4106:	4770      	bx	lr
    4108:	200000b0 	.word	0x200000b0
    410c:	200000d0 	.word	0x200000d0
    4110:	200000b0 	.word	0x200000b0

arm-none-eabi-readelf -W --sections sketch.ino.elf

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 4] .noinit           NOBITS          200000b0 0100b0 000020 00  WA  0   0  4

You can see that the keepMyValue variable is placed at the beginning of the .noinit section. You can also verify that the section is not loaded by the startup code.

Are there any guarantees that the state of SRAM is preserved across (warm) resets?
And even if the value of pi is preserved, how can you be sure that the value of keepMyValue was not corrupted?
This whole approach seems very hacky at best.

Hi, PieterP, thank you for your posting. (Lots of keywords you are using I never came accross before.) As I switched to R4 only recently, there was a bad mistake in my example: though I prefer pi to dead beef, I should have noticed that floating point constants now are declared as double. But neither using double pi nor dead beef my intensiones materialized (possibly because disconnecting/reconnecting to USB when pressing the RESET button), so I have stay with the EEPROM. Nevertheless, thanks again.

The deadbeef in my example was just an easy check to see if the value showed up in .data, I didn't mean it to be used as a magic value at run time.