starter48 7 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба При попытке компиляции проекта с размещением массива/структуры такого вида в последней странице 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 не тестировал. xc16linker_bugfix2.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться