Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Линковщик калечит имена секций. Как предотвратить? IAR ARM 7.3
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
vitkorob
Пишу программу RAM-загрузчик для прошивки флешки непопулярного МК через J-Link Commander или через J-Flash - https://wiki.segger.com/Adding_Support_for_New_Devices

В этой программе надо разделить код в ELF-файле на 3 секции, название которых PrgCode, PrgData, DevDscr. Для этого я написал скрипт линкера (он в листенге ниже). При написании опирался на мануал - https://www.iar.com/support/tech-notes/link...ap-file-v.5.xx/

Код
/*
* Define a memory region that covers the entire 4 GB
* addressible space of the processor.
*/
define memory mem with size = 4G;

/*
* Define a region for the on-chip SRAM
*/
define region RAM_region = mem:[from 0x20000000 to 0x2002FFFF];

/*
* Indicate that the read/write values should be
* initialized by copying from flash.
*/
initialize manually with packing=none { readwrite };

"PrgData":
place in RAM_region { readwrite };

"PrgCode":
place in RAM_region { readonly };

"DevDscr":
place in RAM_region { readonly section DevDscr };


После получения ELF-файла я проверял названия секций утилитой arm-none-eabi-readelf.exe из пакета GNU Tools ARM. К сожалению, я наблюдал, что имена секций МЕНЯЛИСЬ! К секциям приписывался один из суффиксов rw, ro, zi (см. таблицу ниже)

Код
Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 00392c 000000 00      0   0  4
  [ 1] .shstrtab         STRTAB          00000000 00392c 0000e0 00      0   0  4
  [ 2] .strtab           STRTAB          00000000 003a0c 0002a2 00      0   0  4
  [ 3] .symtab           SYMTAB          00000000 003cb0 000330 10      2  37  4
  [ 4] PrgData zi        NOBITS          20000000 000034 00003c 01  WA  0   0  4
  [ 5] PrgCode ro        PROGBITS        2000003c 000034 000100 01  AX  0   0  4
  [ 6] DevDscr ro        PROGBITS        2000013c 000134 0010a0 01   A  0   0  4


Из-за это верхний уровень (J-Link Commander, J-Flash) ломается - не может распарсить ELF-файл, чтобы найти функции прошивки флеша.

Пожалуйста, помогите найти способ предотвратить такой калечение имён секций.
k155la3
"Из-за это(го) .... не может распарсить ...." - а диагностика "нехочухи" есть ?
Есть некоторая вероятность, что дело не в именах секций, а например, в опциях-настройке линкера.
В файле .map имена правильные ?
Если есть возможность - загрузите elf в софт-эмулятор и посмотрите, правильно ли "ложатся" секции на требуемые адреса RAM.
aaarrr
Цитата(vitkorob @ Aug 21 2017, 12:08) *
GNU Tools ARM.

По IAR'у не подскажу, но можно пойти другим путем, раз уж инструментарий в наличии:
objcopy --rename-section oldname=newname
vitkorob
Цитата(k155la3 @ Aug 21 2017, 21:31) *
"Из-за это(го) .... не может распарсить ...." - а диагностика "нехочухи" есть ?
Есть некоторая вероятность, что дело не в именах секций, а например, в опциях-настройке линкера.
В файле .map имена правильные ?
Если есть возможность - загрузите elf в софт-эмулятор и посмотрите, правильно ли "ложатся" секции на требуемые адреса RAM.


Софт J-Link просто пишет одну строку, что не может найти секцию PrgCode в указанном elf-файле - вот и вся диагностика "нехочухи". В map-файле имена правильные, нет ни намека на приписку суффиксов ro, rw, zi. Я уверен, что дело в изменении имен секций линковщиком IAR, потому что после того как "подшаманил" имена секций HEX-редактором, то эту валидацию elf-файл начал проходить.

Цитата(aaarrr @ Aug 22 2017, 00:01) *
По IAR'у не подскажу, но можно пойти другим путем, раз уж инструментарий в наличии:
objcopy --rename-section oldname=newname


Похоже это трагедия IAR'а. Действительно придётся пользоваться дополнительными инструментами для исправления.
jcxz
Цитата(vitkorob @ Aug 21 2017, 12:08) *
Пишу программу RAM-загрузчик для прошивки флешки непопулярного МК через J-Link Commander или через J-Flash
В этой программе надо разделить код в ELF-файле на 3 секции, название которых PrgCode, PrgData, DevDscr.

А зачем вообще Вам эти имена при прошивке? Что Вы с ними делаете?
А если в следующей прошивке имена этих секций в icf-файле будут другие? Или программисту нужно будет добавить новые секции, в другие регионы памяти? Что будете делать?
Для того чтобы определить - нужна секция для прошивки или нет, вроде как достаточно (и более правильно) использовать только флаги (столбец "Flg").
Да - а почему elf-файл, а не hex? Я писал подобный прошивальщик основанный на hex от IAR - проблем никаких не было.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.