Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

GCC Linker

Пт июл 27, 2018 13:30:58

Всем мяу !
Возникла у меня простенькая задача, которую никак не могу решить.
Необходимо с помощью линкера выделить некую область в памяти программ по определённым адресам и поместить в неё инициализированный массив (либо структуру) с данными.
Т.к. я в этих линкерах, скриптах, ... - ноль без палочки, прошу знающих людей дать подсказку, либо небольшой примерчик. Перелопатил кучу статей, форумов, документов - везде ограничиваются примером, типа :
Код:
const char my_data[50] __attribute__( (section("my_section")) ) = {0};

Т.е. размещением данных в собственно-созданной секции.
Оно всё понятно, но вот вопрос - как создать эту секцию с помощью линкерного скрипта? Ума не приложу :dont_know:
Всем ответившим - Спасибо !

Re: GCC Linker

Пт июл 27, 2018 14:23:13

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

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

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


Необходимо с помощью линкера выделить некую область в памяти программ по определённым адресам и поместить в неё инициализированный массив (либо структуру) с данными.

Для чего, если не секрет? Собираешься прошивателем переписывать секцию?
Просто массив объявить как const мало?

Re: GCC Linker

Пт июл 27, 2018 14:34:31

Оно всё понятно, но вот вопрос - как создать эту секцию с помощью линкерного скрипта? Ума не приложу :dont_know:
Вы её создали уже в программе, в скрипте линкера осталось её разместить по нужному адресу. Как? Смотрите по ссылкам от dosikus.

область в памяти программ по определённым адресам и поместить в неё инициализированный массив
А можно все же поинтересоваться, ЗАЧЕМ? Ну должна же быть какая-то причина пришпиленности данных.

Re: GCC Linker

Пт июл 27, 2018 14:41:01

Блин, оказывается у меня компилятор просто выкидывал массив как ненужный. Причём, независимо от 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:
А можно все же поинтересоваться, ЗАЧЕМ? Ну должна же быть какая-то причина пришпиленности данных.
Скажем так - в целях повышения образованности :))

PS: Вот почему так. Мучаешься, сутки не спишь, стоит задать вопрос - сразу находится решение... :facepalm:

Re: GCC Linker

Пт июл 27, 2018 14:48:39

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

Код:
fw_info            (rx) : ORIGIN = 0x9D040000, LENGTH = 0x100


Может все таки rw или даже ro ?

Простое обращение к массиву решила все проблемы.


Используется опция- выкидывать незадействованные сущности.
Так и простые массивы выкидывает.

Re: GCC Linker

Пт июл 27, 2018 15:17:34

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

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

Добавлено after 12 minutes 11 seconds:
Используется опция- выкидывать незадействованные сущности.
Так и простые массивы выкидывает.
Всегда думал, что квалификатор volatile служит для связывания шаловливых ручек оптимизатора :roll:

Re: GCC Linker

Пт июл 27, 2018 15:30:52

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

Re: GCC Linker

Пт июл 27, 2018 15:42:12

Может все таки rw или даже ro ?

Неа, r - чтение, w - запись, x - исполнение. Тогда уж просто r.

Всегда думал, что квалификатор volatile служит для связывания шаловливых ручек оптимизатора :roll:
Отключает оптимизацию доступа к объекту. А нет доступа - нет объекта.

Во, можно такой кейс придумать. Берём на регистры какого-нибудь аппаратного модуля проецируем инициализированный массив с конфигурацией. При запуске в стартапе этот массив будет на место копироваться тем самым конфигурируя аппаратный модуль. Ну это так, чисто поржать :)

Re: GCC Linker

Пт июл 27, 2018 15:58:59

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

Re: GCC Linker

Пт июл 27, 2018 16:03:35

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

Думаю, вот так его даже без обращений линкер не выкинет. Попробуйте для интереса. Без определения MEMORY. Ведь таблица векторов прерываний это точно такой-же массив как и у вас и без обращений.
Код:
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector))
    . = ALIGN(4);
  } >FLASH

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

Re: GCC Linker

Пт июл 27, 2018 16:17:48

VladislavS писал(а):Можно было, правда, сразу за векторами прерываний расположить автоматом.

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