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

Линкер выкидывает нужный код. Как исправить?

Если ставлю -Xlinker --gc-sections выкидывает бутлоадер. Как объяснить линкеру что некоторые секции выбрасывать нельзя?

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


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

SECTIONS
{  
  .text :
  {      
    KEEP(*(.loader.enter)); /* тут имя секции со стартовой функцией бутлоадера */

 

Неясно впрочем, у вас бутлоадер линкуется вместе с программой?

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


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

у вас бутлоадер линкуется вместе с программой?
Присоединяюсь к вопросу. Во избежание сюрпризов их лучше хранить отдельно и при необходимости склеивать вместе выходные .hex непосредственно перед прошивкой.

 

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


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

Неясно впрочем, у вас бутлоадер линкуется вместе с программой?

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

пробовал KEEP все равно выкидывает.

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


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

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

пробовал KEEP все равно выкидывает.

 

Ну значит надо добавить эту функцию в KEEP. Если не получается - попробуйте сократить пример до минимального и выложить.

 

Кстати насчет совместной линковки - как минимум не должно быть двух функций main, нужны отдельные копии всех функций из стандартной библиотеки (а часть арифметики к примеру реализована в виде функций), возможно еще что-то.

 

И зачем отлаживать совместно? В программе делаете некую заглушку, куда приходите по команде "вызвать загрузчик" и отлаживаете себе отдельно от загрузчика...

 

Даже если вам остро необходим загрузчик, возможно проще будет сделать бинарный образ загрузчика (скомпилированного отдельно) и этот образ прилинковывать к основной программе.

 

Линковать вместе - это просто поход по граблям...

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


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

Ну значит надо добавить эту функцию в KEEP.

Можно поподробнее как это делается.

Линковать вместе - это просто поход по граблям...

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

Вот проект с загрузчиком на базе LWIP это да, все функции пометить префиксом BOOTLOADER та еще работа и можно что-нибудь пропустить.

Изменено пользователем viakon

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


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

В чем грабли то?

1) Библиотечные функции. Если компилятор их решил использовать, то у загрузчика они должны быть свои. А это может быть что угодно - арифметика, ветвление по таблице, пролог/эпилог функций и т.д.

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

3) потом их все равно надо разделить, чтобы послать пользователям только приложение.

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


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

Можно поподробнее как это делается.

Я ж писал выше - KEEP(*(xxx)), где xxx - имя секции с этой функцией. Его можно посмотреть в map-файле

 

но опять же, если загрузчик тривиальный, сделайте заглушку

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


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

1) Библиотечные функции. Если компилятор их решил использовать, то у загрузчика они должны быть свои. А это может быть что угодно - арифметика, ветвление по таблице, пролог/эпилог функций и т.д.

Простенький бут обходится без библиотечных функций.

 

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

У меня обычно вызов только одной функции из основной программы, она размещается в отдельной секции, и никаких проблем с совместимостью.

 

3) потом их все равно надо разделить, чтобы послать пользователям только приложение.

Ну а это то вообще элементарно, основная программа в секциях isr_vector, text и data

arm-none-eabi-objcopy -O binary -j .isr_vector -j .text -j .data

В результате бут по CSD звонку обновляет программу.

 

 

Я ж писал выше - KEEP(*(xxx)), где xxx - имя секции с этой функцией. Его можно посмотреть в map-файле

 

но опять же, если загрузчик тривиальный, сделайте заглушку

Да пробовал я KEEP, выкидывает :(.

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


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

Простенький бут обходится без библиотечных функций.
Каждый имеет право ходить по собственноручно разложенным граблям.

Да пробовал я KEEP, выкидывает :(.
Показывайте, у меня не выкидывает.

 

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


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

А я использую __attribute__((used))

 

used

This attribute, attached to a function, means that code must be emitted for the function even if it appears that the function is not referenced. This is useful, for example, when the function is referenced only in inline assembly.

 

used

This attribute, attached to a variable with static storage, means that the variable must be emitted even if it appears that the variable is not referenced.

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


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

Показывайте, у меня не выкидывает.

Спасибо всем. Создал новый проект, перенес в него исходники, KEEP заработал. Разбираться со старым не стал.

 

Вопрос к Гуру, как правильно прилинковать готовый бут к проекту?

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


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

Есть вариант когда вместе, удобнее отлаживать все разом.

Правильные отладчики могут загружать отладочную информацию из двух и более программ. Кейл, к примеру, это умеет. Собственно, именно так я и отлаживал совместно загрузчик и основную программу. А линковать их вместе - это какой-то адЪ и раскидывание граблей перед собой.

 

Вопрос к Гуру, как правильно прилинковать готовый бут к проекту?

Зачем? У нас на производстве сначала прошивается загрузчик, а уже через него заливается основная прошивка (через Ethernet). Заодно тестируется работоспособность порта Ethernet.

Если всё же хочется прошивать сразу и то и другое, выше уже было сказано, что объединять их надо на уровне HEX. К примеру, SRecord это умеет.

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


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

Правильные отладчики могут загружать отладочную информацию из двух и более программ.

 

Хм, не думал о таком. Я на gdb загружал загрузчик и программу, а потом отлаживал или то или другое. Интересно, gdb умеет загружать одновременно?*\

 

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


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

Хм, не думал о таком. Я на gdb загружал загрузчик и программу, а потом отлаживал или то или другое. Интересно, gdb умеет загружать одновременно?*\

Одновременно это как? Можно загрузить два elf файла.

Гружу загрузчик, потом основной проект. Не нашел как сделать так чтоб в загрузчике код отображался, символьная информация грузится только для основной программы. Ну или только для загрузчика (если запустить отладку загрузчика). Как в GDB подгрузить символьные данные?

Все таки классная штука SWD, можно не гнять комп на отладке по ночам. Заметил что девайс работает как-то не так подключил SWD зашел в отладку без загрузки флеша и смотри, что не так, программа-то не перезагружается, продолжает работать. Как я намучился с вечно падающим JTAG у AVR. Щелкнуло реле на плате, и все, синхронизация потеряна.

 

PS: нашел, команда file имя_проекта.elf грузит символьную информацию. Вот только старую забывает. Перешел из лоадера в основной проект, грузи ручками. Вернулся обратно снова грузи.

Как бы сделать чтоб оба elf грузились одновременно.

Изменено пользователем viakon

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


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

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

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

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

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

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

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

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

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

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