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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Линкер выкидывает нужный код. Как исправить?
viakon
сообщение Dec 8 2015, 05:23
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Если ставлю -Xlinker --gc-sections выкидывает бутлоадер. Как объяснить линкеру что некоторые секции выбрасывать нельзя?
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Dec 8 2015, 05:34
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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


Неясно впрочем, у вас бутлоадер линкуется вместе с программой?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 8 2015, 07:40
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
viakon
сообщение Dec 8 2015, 07:49
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Цитата(Непомнящий Евгений @ Dec 8 2015, 10:34) *
Неясно впрочем, у вас бутлоадер линкуется вместе с программой?

Есть вариант когда вместе, удобнее отлаживать все разом. В данном случае отдельно. Но основная программа вызывает функцию в бутлодыре, вот ее при компиляции и выкидывает.
пробовал KEEP все равно выкидывает.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Dec 8 2015, 08:02
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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


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

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

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

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

Линковать вместе - это просто поход по граблям...
Go to the top of the page
 
+Quote Post
viakon
сообщение Dec 8 2015, 09:23
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



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

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

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

Сообщение отредактировал viakon - Dec 8 2015, 09:30
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 8 2015, 11:56
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(viakon @ Dec 8 2015, 12:23) *
В чем грабли то?

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Dec 8 2015, 12:31
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(viakon @ Dec 8 2015, 12:23) *
Можно поподробнее как это делается.

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

но опять же, если загрузчик тривиальный, сделайте заглушку
Go to the top of the page
 
+Quote Post
viakon
сообщение Dec 8 2015, 15:57
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Цитата(Сергей Борщ @ 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.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 8 2015, 18:54
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(viakon @ Dec 8 2015, 18:57) *
Простенький бут обходится без библиотечных функций.
Каждый имеет право ходить по собственноручно разложенным граблям.
Цитата(viakon @ Dec 8 2015, 18:57) *
Да пробовал я KEEP, выкидывает sad.gif.
Показывайте, у меня не выкидывает.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Dec 9 2015, 09:21
Сообщение #11


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



А я использую __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.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
viakon
сообщение Dec 10 2015, 04:36
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Цитата(Сергей Борщ @ Dec 8 2015, 23:54) *
Показывайте, у меня не выкидывает.

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

Вопрос к Гуру, как правильно прилинковать готовый бут к проекту?
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 10 2015, 07:49
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

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

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

Зачем? У нас на производстве сначала прошивается загрузчик, а уже через него заливается основная прошивка (через Ethernet). Заодно тестируется работоспособность порта Ethernet.
Если всё же хочется прошивать сразу и то и другое, выше уже было сказано, что объединять их надо на уровне HEX. К примеру, SRecord это умеет.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Dec 10 2015, 07:51
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(scifi @ Dec 10 2015, 10:44) *
Правильные отладчики могут загружать отладочную информацию из двух и более программ.


Хм, не думал о таком. Я на gdb загружал загрузчик и программу, а потом отлаживал или то или другое. Интересно, gdb умеет загружать одновременно?*\
Go to the top of the page
 
+Quote Post
viakon
сообщение Dec 18 2015, 05:06
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



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

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

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

Сообщение отредактировал viakon - Dec 18 2015, 06:48
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 8th July 2025 - 00:20
Рейтинг@Mail.ru


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