А чем вам не нравится стандартный линк файл от WCH который есть во
всех примерах - там порядок сегментов .data / .sdata / .sbss / .bss
и $gp инициализируется на начало сегмента .sdata + 0x800. И так как
.sbss = .bss то при релаксации (-Wl,--relax включена по умолчанию)
всё .bss доступно сразу по $gp (естественно в пределах +-2K
смещения). А для использования .sdata надо задать как раз параметр
-msmall-data-limit. Сегменты .sdata и .sbss рядом вместе. .data :
{
*(.gnu.linkonce.r.*)
*(.data .data.*)
*(.gnu.linkonce.d.*)
. = ALIGN(8);
PROVIDE( __global_pointer$ = . + 0x800 );
*(.sdata .sdata.*)
*(.sdata2.*)
*(.gnu.linkonce.s.*)
. = ALIGN(8);
*(.srodata.cst16)
*(.srodata.cst8)
*(.srodata.cst4)
*(.srodata.cst2)
*(.srodata .srodata.*)
. = ALIGN(4);
PROVIDE( _edata = .);
} >RAM AT>FLASH
.bss :
{
. = ALIGN(4);
PROVIDE( _sbss = .);
*(.sbss*)
*(.gnu.linkonce.sb.*)
*(.bss*)
*(.gnu.linkonce.b.*)
*(COMMON*)
. = ALIGN(4);
PROVIDE( _ebss = .);
} >RAM AT>FLASH