Загрузка ELF при VMA! = LMA


У меня проблема с этим. Я использую ARM Cortex-A9 с DS-5 для создания прошивки без покрытия. Я изменил свой файл компоновщика, чтобы намеренно поместить LMA раздела .data рядом с разделами text и rodata, потому что его VMA времени выполнения по умолчанию находится на расстоянии 1 МБ, а изображение .bin имеет размер около 1 МБ, но содержит 90% нулей. И поэтому я намеренно сделал LMA! = VMA для экономии места. Я также добавил код в start.S, который перемещает раздел .data из его lma в vma.

Однако при загрузке результирующего файла elf в DS-5 он уже загружает все разделы в их VMA. В результате мой код start.S, который должен перемещать данные, скопирован из LMA с содержимым мусора в уже правильный VMA, и вскоре после этого этот мусор привел к сбою.

У меня был опыт работы с неравными VMA и LMA в двоичном коде в Cortex-M4, и я использовал gdb для его отладки elf, и там не было никаких проблем, но это был микроконтроллер. В моем текущем приложении процессора ARM, как бы я затем смоделировал в elf отладке сценарий правильного копирования данных из его LMA в VMA. Скорее всего, при загрузке в автономном режиме с использованием двоичного формата проблем не возникнет, но сейчас мы все еще находимся в процессе отладки elf, поэтому я должен это исправить.


person ubermensch    schedule 06.10.2016    source источник
comment
Я не знаю DS-5, но проверьте, можете ли вы переместить разделы в скрипте при загрузке файла ELF. По крайней мере, это возможно с T32.   -  person juansolsona    schedule 06.10.2016
comment
ARM DS-5 - это IDE, которую мы используем для разработки прошивки, работающей на ARM. Он построен на Eclipse. Это тот, который загружает файл elf для запуска прямо из SDRAM и позволяет нам отлаживать.   -  person ubermensch    schedule 07.10.2016
comment
Я взглянул на команды отладчика в DS5 (static.docs.arm.com / dui0452 / y /) и, похоже, если вы можете применить смещение к команде загрузки, посмотрите страницу 1.3.85. DS5 также поддерживает синтаксис команд (CMM), подобный T32, но, похоже, только частично, тем не менее вы можете проверить data.load.elf FileName.AXF reloc .text по адресу 0xaddress (www2.lauterbach.com/pdf/general_ref_d.pdf) Надеюсь, это поможет.   -  person juansolsona    schedule 08.10.2016


Ответы (1)


Проблема решена ... Я хотел бы поделиться предложенным мне решением:

Это помогает понять, что «VMA» и «LMA» являются терминологией утилит GNU, а не в спецификации ELF. Как только вы перейдете к просмотру этого файла после интерпретации исполняемого файла ELF, вы обнаружите, что есть поле заголовка программы с именем «p_paddr» и другое, называемое «p_vaddr», что упрощает поиск! Вариант, который вам нужен в DS-5 для использования p_paddr:

Справка по командам отладчика ARM DS-5: 1.3.138 set elf load-segment-at-p_paddr

По умолчанию DS-5 использует стандартный p_vaddr. Использование p_paddr - это качество реализации, и оно очень свободно определено в спецификации. Компилятор ARM, компоновщик и библиотека C не генерируют эту информацию, так как процесс перемещения обрабатывается внутренне (загрузка с разбросом). В некоторых средах p_paddr используется не как физический адрес, а как адрес загрузки (отсюда «LMA»), а некоторые используют его как адрес для разрешения символов до и после включения MMU.

person ubermensch    schedule 10.10.2016
comment
Спасибо. Это мне действительно помогло. - person Realtime Rik; 17.12.2018