Спасибо. Всё же, переделал без вмешательства в скрипт линкера. Всё
определяется в коде Си. Из недостатков - лишь невозможность
определить размер объекта со смещением. Сделал так: #define FLASHemptyRaw 0xFFFFu //Unscrambled value of empyt FLAHS cell
#define FLASHscramb 0x1CC6u //Hardware XOR scrambling value
#define FLASHemptyHW (FLASHemptyRaw ^ FLASHscramb) //0xE339u - empty half word value of erased FLASH cell after hardware scrambling
#define FLASHemptyWord (((uint32_t)FLASHemptyHW << 16) | FLASHemptyHW) //0xE339E339 erased FLASH state in a word
#define StdPageSize 4096u //Standard page size in bytes (used as recommended FLASH area size)
#define FastPageSize 256u //Minumum writtable FLASH size in bytes
#define EEPROMemulSize StdPageSize
//Define FLASH region for EEPROM emulation and initialize it by 0xFFFFu respecting hardware scrambling
volatile const uint32_t __attribute__ ((section (".rodata"), aligned (FastPageSize))) FLASHdata[EEPROMemulSize / sizeof (uint32_t)] = {FLASHemptyWord};
const uint32_t FLASHdirectAccess = (uint32_t)FLASHdata + FLASH_BASE; //FLASH direct access alias address value for FLASHdata allotment
const uint32_t FLASHsize = (uint32_t)sizeof (FLASHdata);//Dedicated FLASH size in bytes
В коде взаимодействия с флеш, в подавляющем большинстве случаев всё равно используется просто uint32_t, а не указатель. Лишь для прямого чтения привожу тип FLASHdirectAccess к нужному указателю. Руководство говорит, что можно читать хоть побайтно.
Без явного указания секции, расположенной во флеш, эти 4к занимают ОЗУ. Указал .rodata - норм. Всё работает и ОЗУ не занимает.
С приведённым выше кодом, флеш инициализируется 0xFFFF (читается как 0xE339), как и положено. Чиста и готова к записи.