Уже убедиля. Все нормально. Делается релаксация библиотечного кода,
если переменные расположены в области досягаемости. Кстати, я задаю
global pointer таким образом: .data :
{
. = ALIGN(4);
PROVIDE(_data_vma = .);
PROVIDE( __global_pointer$ = . + (((_fastdata_end - .) > 0x1000) ? _fastdata_end - . - 0x800 : 0x800) );
*(.gnu.linkonce.r.*)
*(.data .data.*)
*(.gnu.linkonce.d.*)
. = ALIGN(8);
*(.sdata .sdata.*)
*(.gnu.linkonce.s.*)
*(.fastdata .fastdata.*);
. = ALIGN(4);
PROVIDE( _edata = .);
} >RAM AT>FLASH
/* GCC v8 use _edata..._end for init BSS section to 0 (_start) */
/* GCC v12 use __bss_start..._end for init BSS section to 0 (_start) */
.bss :
{
. = ALIGN(4);
PROVIDE( __bss_start = .);
*(.fastdata_z .fastdata_z.*);
. = ALIGN(4);
PROVIDE( _fastdata_end = . );
*(.sbss*)
...
Секции .fastdata и .fastdata_z служат для гарантированного размещения своих переменных в доступной области GP. Остальные - как повезет.