реклама на сайте
подробности

 
 
> GNU ld: хочу странного: разместить перекрывающиеся секции
Andrey Vasilyev
сообщение Apr 8 2018, 16:02
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 5-12-08
Из: Санкт-Петербург
Пользователь №: 42 220



Коллеги, здравствуйте

Прошу помощи от гуру, хорошо разбирающихся в GNU ld.

Поднимаю сейчас компиляцию нашей софтины под странную платформу. Ее особенность - все исполнение идет из RAM, причем RAM там разделено на 4 куска по полмегабайта, и 3 из 4 кусков поддерживают доступ только двойными словами: при попытке обратиться как к байту или как к полуслову вылетает data abort.
Если быть точным, это не платформа странная, а я от нее хочу странного - пытаюсь заиспользовать память DSP-шных ядер для чего-то полезного, ибо сами эти ядра нам не нужны.

Первого полумегабайта нам совсем не хватает под все наши нужды, поэтому сделал следующее:
1. У нас довольно много данных в .bss, к которым идет обращение только словами, и я их вынес в отдельную секцию, назвал которую .bss32bit (и размещаю ее в той части памяти, которая чисто 32-битная)
2. Код собираю в 32-битном режиме ARM, а не в Thumb, и разместил его тоже в чисто-32-битном блоке

В итоге, вроде бы все прекрасно - под .data и .bss в первом блоке места достаточно, и остается еще прилично места под кучу.
Но тут вылезает еще одно неудобство: простым образом при старте можно загрузить снаружи бинарник только в первый блок, и соответственно, хочется стартовать оттуда, в startup-е перемещая .text куда нужно и очищая оба .bss-а как обычно. Этакое исполнение из flash-а наоборот - не .data перемещается, а .text.
Реализовал это все, и даже все работает - после старта .text копируется во второй блок, .bss очищается, .bss32bit тоже очищается, передается управление на main, и дальше все работает.

Но после перемещения .text место из-под него в первом блоке уже свободно, и хотелось бы переиспользовать его под .bss (сейчас там располагается куча, но .bss у нас тоже большой).
Пытаюсь понять про оверлеи в доке ld, но там указано, что для секций внутри оверлея нельзя указать LMA и/или VMA, они указываются только для самой оверлейной области.

Понимаю, что можно решить задачу грубой силой - .text при линковке вообще выносить в отдельный файл и при старте стартапным кодом сразу грузить его снаружи прямо в нужную память. Но очень уж не хочется такого монстра в стартапном коде городить...

Может быть, кто-то может подсказать какой-то трюк, который все-таки позволит слинковать .bss в ту же память, которая была LMA .text-а?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 05:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01347 секунд с 7
ELECTRONIX ©2004-2016