При попытке компиляции проекта с размещением массива/структуры такого вида в последней странице flash (для эмуляции EEPROM):
Код
__attribute__((space(prog),page,address(__PROGRAM_BASE + __PROGRAM_LENGTH - (_FLASH_PAGE * 2)),noload,keep,section(".eeprom"))) union {
int bin[_FLASH_PAGE -1];// -1 need to avoid linker error "absolute section crosses the boundary of region program"
} last_flash_page_cal_data;
линкеры coff-ld.exe и elf-ld.exe "падают".
Покопавшись отладчиком, я обнаружил, что проблема в опечатке в следующей строке формата fprintf в линкере:
Код
"/n Could not use block at address %d and of size % to locate section %s because this will lead to having executable code at the last word of program memory./n"
здесь пропущен символ 'u' после знака '%', т.о. получается нарушение соответствия формата аргументам fprinf.
Вот патч для исправления виндового линкера v1.26:
Код
coff-ld.exe
0006F666: 20 75;change '% ' to '%u'
elf-ld.exe
00089D32: 20 75;change '% ' to '%u'
Но более старые версии XC16, и версии под другие ОС тоже содержат эту ошибку.
Также прилагаю продвинутую автопатчилку, которая
вставляет символ 'u', а не заменяет им пробел.
Под виндой патчилка должна сама находить посл. установленную версию XC16.
Под Linux-ом можно запускать с помощью WINE. Но каталог с линкерами (coff-ld и elf-ld) придётся указать руками. И про write permissions не забудьте.
Или можно пропатчить линуксовые coff-ld и elf-ld на компе с виндой.
С MacOS не тестировал.