Перейти к содержанию
    

Линковщик калечит имена секций. Как предотвратить? IAR ARM 7.3

Пишу программу 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-файл, чтобы найти функции прошивки флеша.

 

Пожалуйста, помогите найти способ предотвратить такой калечение имён секций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Из-за это(го) .... не может распарсить ...." - а диагностика "нехочухи" есть ?

Есть некоторая вероятность, что дело не в именах секций, а например, в опциях-настройке линкера.

В файле .map имена правильные ?

Если есть возможность - загрузите elf в софт-эмулятор и посмотрите, правильно ли "ложатся" секции на требуемые адреса RAM.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

GNU Tools ARM.

По IAR'у не подскажу, но можно пойти другим путем, раз уж инструментарий в наличии:

objcopy --rename-section oldname=newname

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Из-за это(го) .... не может распарсить ...." - а диагностика "нехочухи" есть ?

Есть некоторая вероятность, что дело не в именах секций, а например, в опциях-настройке линкера.

В файле .map имена правильные ?

Если есть возможность - загрузите elf в софт-эмулятор и посмотрите, правильно ли "ложатся" секции на требуемые адреса RAM.

 

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

 

По IAR'у не подскажу, но можно пойти другим путем, раз уж инструментарий в наличии:

objcopy --rename-section oldname=newname

 

Похоже это трагедия IAR'а. Действительно придётся пользоваться дополнительными инструментами для исправления.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишу программу RAM-загрузчик для прошивки флешки непопулярного МК через J-Link Commander или через J-Flash

В этой программе надо разделить код в ELF-файле на 3 секции, название которых PrgCode, PrgData, DevDscr.

А зачем вообще Вам эти имена при прошивке? Что Вы с ними делаете?

А если в следующей прошивке имена этих секций в icf-файле будут другие? Или программисту нужно будет добавить новые секции, в другие регионы памяти? Что будете делать?

Для того чтобы определить - нужна секция для прошивки или нет, вроде как достаточно (и более правильно) использовать только флаги (столбец "Flg").

Да - а почему elf-файл, а не hex? Я писал подобный прошивальщик основанный на hex от IAR - проблем никаких не было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...