GCC Linker

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

GCC Linker

Сообщение Аlex »

Всем мяу !
Возникла у меня простенькая задача, которую никак не могу решить.
Необходимо с помощью линкера выделить некую область в памяти программ по определённым адресам и поместить в неё инициализированный массив (либо структуру) с данными.
Т.к. я в этих линкерах, скриптах, ... - ноль без палочки, прошу знающих людей дать подсказку, либо небольшой примерчик. Перелопатил кучу статей, форумов, документов - везде ограничиваются примером, типа :

Код: Выделить всё

const char my_data[50] __attribute__( (section("my_section")) ) = {0};
Т.е. размещением данных в собственно-созданной секции.
Оно всё понятно, но вот вопрос - как создать эту секцию с помощью линкерного скрипта? Ума не приложу :dont_know:
Всем ответившим - Спасибо !
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: GCC Linker

Сообщение dosikus »

http://embedders.org/blog/teap0t/miro-s ... c_301_Link

Но лучше с самого начала

http://embedders.org/blog/teap0t/miro-s ... age=0,3&6=


[uquote="Аlex",url="/forum/viewtopic.php?p=3426961#p3426961"]Необходимо с помощью линкера выделить некую область в памяти программ по определённым адресам и поместить в неё инициализированный массив (либо структуру) с данными.[/uquote]
Для чего, если не секрет? Собираешься прошивателем переписывать секцию?
Просто массив объявить как const мало?
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: GCC Linker

Сообщение VladislavS »

[uquote="Аlex",url="/forum/viewtopic.php?p=3426961#p3426961"]Оно всё понятно, но вот вопрос - как создать эту секцию с помощью линкерного скрипта? Ума не приложу :dont_know:[/uquote] Вы её создали уже в программе, в скрипте линкера осталось её разместить по нужному адресу. Как? Смотрите по ссылкам от dosikus.
область в памяти программ по определённым адресам и поместить в неё инициализированный массив
А можно все же поинтересоваться, ЗАЧЕМ? Ну должна же быть какая-то причина пришпиленности данных.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: GCC Linker

Сообщение Аlex »

Блин, оказывается у меня компилятор просто выкидывал массив как ненужный. Причём, независимо от volatile. А я и так, и сяк, и что только в скрипте не писал... :))
Простое обращение к массиву решила все проблемы.

Добавлено after 1 minute 35 seconds:

Код: Выделить всё

volatile const char my_data[0x100] __attribute__( (section(".fw_info")) ) = {0};
В линкере :

Код: Выделить всё

MEMORY
{
    fw_info            (rx) : ORIGIN = 0x9D040000, LENGTH = 0x100
    .....
    .....

}

SECTIONS
{
    .fw_info ORIGIN(fw_info) : {
        KEEP(*(.fw_info))
    }
}
Добавлено after 4 minutes 37 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=3426992#p3426992"]А можно все же поинтересоваться, ЗАЧЕМ? Ну должна же быть какая-то причина пришпиленности данных.[/uquote] Скажем так - в целях повышения образованности :))

PS: Вот почему так. Мучаешься, сутки не спишь, стоит задать вопрос - сразу находится решение... :facepalm:
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: GCC Linker

Сообщение dosikus »

Волшебная сила форума ...

Код: Выделить всё

fw_info            (rx) : ORIGIN = 0x9D040000, LENGTH = 0x100
Может все таки rw или даже ro ?

[uquote="Аlex",url="/forum/viewtopic.php?p=3426993#p3426993"]Простое обращение к массиву решила все проблемы.[/uquote]

Используется опция- выкидывать незадействованные сущности.
Так и простые массивы выкидывает.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: GCC Linker

Сообщение Аlex »

dosikus писал(а):Может все таки rw или даже ro ?
Может быть.
Скопипиздил с соседней строчки, объявляющую регион программной памяти :dont_know:

PS: Пофиг, работает и ладно :)))

Добавлено after 12 minutes 11 seconds:
[uquote="dosikus",url="/forum/viewtopic.php?p=3427011#p3427011"]Используется опция- выкидывать незадействованные сущности.
Так и простые массивы выкидывает.[/uquote] Всегда думал, что квалификатор volatile служит для связывания шаловливых ручек оптимизатора :roll:
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18632
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: GCC Linker

Сообщение ARV »

Аlex писал(а):Всегда думал, что квалификатор volatile служит для связывания шаловливых ручек оптимизатора
ну дык для оптимизатора компилятора так и есть, а для линкера свою роль играет опция -Wl,-gc-sections - убирать неиспользуемые секции
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: GCC Linker

Сообщение VladislavS »

[uquote="dosikus",url="/forum/viewtopic.php?p=3427011#p3427011"]Может все таки rw или даже ro ?[/uquote]
Неа, r - чтение, w - запись, x - исполнение. Тогда уж просто r.

[uquote="Аlex",url="/forum/viewtopic.php?p=3427020#p3427020"]Всегда думал, что квалификатор volatile служит для связывания шаловливых ручек оптимизатора :roll:[/uquote]Отключает оптимизацию доступа к объекту. А нет доступа - нет объекта.

Во, можно такой кейс придумать. Берём на регистры какого-нибудь аппаратного модуля проецируем инициализированный массив с конфигурацией. При запуске в стартапе этот массив будет на место копироваться тем самым конфигурируя аппаратный модуль. Ну это так, чисто поржать :)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: GCC Linker

Сообщение Аlex »

Отвечаю на вопрос "Зачем это всё ?". Ибо, на самом деле, со стороны всё это выглядит глупым забиванием мозгов :)
Это нужно для бутлодыря. Точнее не для него самого, а для ПО, которое он шьёт.
В самом начале области кода я размещаю необходимую инфу о программе (имя, версия, стартовый адрес, ...), а бутлодырь, читая эту область, знает всё о ней.
По большому счёту, мне нужна инфа только для того, чтобы бут писал её на дисплее, при выборе бинарного файла.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: GCC Linker

Сообщение VladislavS »

Ну по имени вашей секции это было понятно. Имеет право на существование. Можно было, правда, сразу за векторами прерываний расположить автоматом. Никто бы его оттуда не сдвинул.

Думаю, вот так его даже без обращений линкер не выкинет. Попробуйте для интереса. Без определения MEMORY. Ведь таблица векторов прерываний это точно такой-же массив как и у вас и без обращений.

Код: Выделить всё

  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector))
    . = ALIGN(4);
  } >FLASH

   .fw_info :
  {
    . = ALIGN(4);
    KEEP(*(.fw_info))
  } >FLASH  
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: GCC Linker

Сообщение Аlex »

VladislavS писал(а):Можно было, правда, сразу за векторами прерываний расположить автоматом.
Тут уже, в принципе, без разницы, где её размещать.
Вектора прерываний в моём МК могут находиться в любом месте, их адреса - не константы. PIC32MZ. Отсюда и линковка с бутом делаются проще - для каждой программы всё своё (адреса), только джампами прыгай на стартап ...
Ответить

Вернуться в «Разные вопросы по МК»