Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Линкер выкидывает нужный код. Как исправить?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
viakon
Если ставлю -Xlinker --gc-sections выкидывает бутлоадер. Как объяснить линкеру что некоторые секции выбрасывать нельзя?
Непомнящий Евгений
Код
SECTIONS
{  
  .text :
  {      
    KEEP(*(.loader.enter)); /* тут имя секции со стартовой функцией бутлоадера */


Неясно впрочем, у вас бутлоадер линкуется вместе с программой?
Сергей Борщ
Цитата(Непомнящий Евгений @ Dec 8 2015, 08:34) *
у вас бутлоадер линкуется вместе с программой?
Присоединяюсь к вопросу. Во избежание сюрпризов их лучше хранить отдельно и при необходимости склеивать вместе выходные .hex непосредственно перед прошивкой.
viakon
Цитата(Непомнящий Евгений @ Dec 8 2015, 10:34) *
Неясно впрочем, у вас бутлоадер линкуется вместе с программой?

Есть вариант когда вместе, удобнее отлаживать все разом. В данном случае отдельно. Но основная программа вызывает функцию в бутлодыре, вот ее при компиляции и выкидывает.
пробовал KEEP все равно выкидывает.
Непомнящий Евгений
Цитата(viakon @ Dec 8 2015, 10:49) *
Есть вариант когда вместе, удобнее отлаживать все разом. В данном случае отдельно. Но основная программа вызывает функцию в бутлодыре, вот ее при компиляции и выкидывает.
пробовал KEEP все равно выкидывает.


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

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

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

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

Линковать вместе - это просто поход по граблям...
viakon
Цитата(Непомнящий Евгений @ Dec 8 2015, 13:02) *
Ну значит надо добавить эту функцию в KEEP.

Можно поподробнее как это делается.
Цитата(Непомнящий Евгений @ Dec 8 2015, 13:02) *
Линковать вместе - это просто поход по граблям...

В чем грабли то? Если загрузчик состоит всего из нескольких функций, то несложно прямо указать их расположение в секции BOOTLOADER.
Вот проект с загрузчиком на базе LWIP это да, все функции пометить префиксом BOOTLOADER та еще работа и можно что-нибудь пропустить.
Сергей Борщ
Цитата(viakon @ Dec 8 2015, 12:23) *
В чем грабли то?

1) Библиотечные функции. Если компилятор их решил использовать, то у загрузчика они должны быть свои. А это может быть что угодно - арифметика, ветвление по таблице, пролог/эпилог функций и т.д.
2) Неловкое движение может сделать вашу программу несовместимой с загрузчиками старых версий в предыдущих версиях уже проданного железа. При этом она будет дружить с последней версией загрузчика, вместе с которой собирается
3) потом их все равно надо разделить, чтобы послать пользователям только приложение.
Непомнящий Евгений
Цитата(viakon @ Dec 8 2015, 12:23) *
Можно поподробнее как это делается.

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

но опять же, если загрузчик тривиальный, сделайте заглушку
viakon
Цитата(Сергей Борщ @ Dec 8 2015, 16:56) *
1) Библиотечные функции. Если компилятор их решил использовать, то у загрузчика они должны быть свои. А это может быть что угодно - арифметика, ветвление по таблице, пролог/эпилог функций и т.д.

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

Цитата(Сергей Борщ @ Dec 8 2015, 16:56) *
2) Неловкое движение может сделать вашу программу несовместимой с загрузчиками старых версий в предыдущих версиях уже проданного железа. При этом она будет дружить с последней версией загрузчика, вместе с которой собирается

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

Цитата(Сергей Борщ @ Dec 8 2015, 16:56) *
3) потом их все равно надо разделить, чтобы послать пользователям только приложение.

Ну а это то вообще элементарно, основная программа в секциях isr_vector, text и data
arm-none-eabi-objcopy -O binary -j .isr_vector -j .text -j .data
В результате бут по CSD звонку обновляет программу.


Цитата(Непомнящий Евгений @ Dec 8 2015, 17:31) *
Я ж писал выше - KEEP(*(xxx)), где xxx - имя секции с этой функцией. Его можно посмотреть в map-файле

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

Да пробовал я KEEP, выкидывает sad.gif.
Сергей Борщ
Цитата(viakon @ Dec 8 2015, 18:57) *
Простенький бут обходится без библиотечных функций.
Каждый имеет право ходить по собственноручно разложенным граблям.
Цитата(viakon @ Dec 8 2015, 18:57) *
Да пробовал я KEEP, выкидывает sad.gif.
Показывайте, у меня не выкидывает.
MrYuran
А я использую __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.
viakon
Цитата(Сергей Борщ @ Dec 8 2015, 23:54) *
Показывайте, у меня не выкидывает.

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

Вопрос к Гуру, как правильно прилинковать готовый бут к проекту?
scifi
Цитата(viakon @ Dec 8 2015, 10:49) *
Есть вариант когда вместе, удобнее отлаживать все разом.

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

Цитата(viakon @ Dec 10 2015, 07:36) *
Вопрос к Гуру, как правильно прилинковать готовый бут к проекту?

Зачем? У нас на производстве сначала прошивается загрузчик, а уже через него заливается основная прошивка (через Ethernet). Заодно тестируется работоспособность порта Ethernet.
Если всё же хочется прошивать сразу и то и другое, выше уже было сказано, что объединять их надо на уровне HEX. К примеру, SRecord это умеет.
Непомнящий Евгений
Цитата(scifi @ Dec 10 2015, 10:44) *
Правильные отладчики могут загружать отладочную информацию из двух и более программ.


Хм, не думал о таком. Я на gdb загружал загрузчик и программу, а потом отлаживал или то или другое. Интересно, gdb умеет загружать одновременно?*\
viakon
Цитата(Непомнящий Евгений @ Dec 10 2015, 12:51) *
Хм, не думал о таком. Я на gdb загружал загрузчик и программу, а потом отлаживал или то или другое. Интересно, gdb умеет загружать одновременно?*\

Одновременно это как? Можно загрузить два elf файла.
Гружу загрузчик, потом основной проект. Не нашел как сделать так чтоб в загрузчике код отображался, символьная информация грузится только для основной программы. Ну или только для загрузчика (если запустить отладку загрузчика). Как в GDB подгрузить символьные данные?
Все таки классная штука SWD, можно не гнять комп на отладке по ночам. Заметил что девайс работает как-то не так подключил SWD зашел в отладку без загрузки флеша и смотри, что не так, программа-то не перезагружается, продолжает работать. Как я намучился с вечно падающим JTAG у AVR. Щелкнуло реле на плате, и все, синхронизация потеряна.

PS: нашел, команда file имя_проекта.elf грузит символьную информацию. Вот только старую забывает. Перешел из лоадера в основной проект, грузи ручками. Вернулся обратно снова грузи.
Как бы сделать чтоб оба elf грузились одновременно.
scifi
Цитата(viakon @ Dec 18 2015, 08:06) *
Как бы сделать чтоб оба elf грузились одновременно.

Может быть, гугл что-нибудь знает?
Анжела
__attribute__((used)) wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.