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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Размещение части функций в отдельной секции, Линкер не видит ссылки на секцию
MrYuran
сообщение May 23 2011, 09:41
Сообщение #1


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

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



Добрый день, уважаемые знатоки!
Тема такая:
Необходимо часть функций (т.н. метрологически значимые) разместить в отдельной секции, чтобы сформировать по ним отдельную контрольную сумму.
Компилятор - MSPGCC.
Делаем так:

объявляем секцию в makefile
Код
LDFLAGS += -Wl,--section-start
LDFLAGS += -Wl,.metrology=0xB000


Размещаем в этой секции необходимые функции:
Код
void ShowMiddleTemp(struct IND_PARAMS_Channel *stParams, unsigned char ucCol, unsigned char ucPage) __attribute__ (( section(".metrology") ));


Вызываем функцию, использующую адреса границ нашей секции:
Код
extern unsigned short __start_metrology;
            extern unsigned short __stop_metrology;

unsigned short  *addr_start = &__start_metrology;
unsigned short  *addr_stop = &__stop_metrology;


MyCRC32 = Crc32(addr_start, (addr_stop - addr_start));


========================================

Результат: undefined reference to `__start_metrology'

Выдержки из .map и .lst и .elf:

Код
.metrology      0x0000b000      0x57a

__start_metrology                                 ./Obj/ххх.o
__stop_metrology                                  ./Obj/ххх.o

Address of section .metrology set to 0xb000

SYMBOL TABLE:
0000b000 l    d  .metrology00000000 .metrology

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .metrology        PROGBITS        0000b000 0097d8 00057a 00  AX  0   0  2


То есть, по всему видно, что секция создана, она не пустая и включена в конечную прошивку.
Но при этом ссылки на её границы не определены.

Какие будут мысли?

PS; что характерно, идентификаторы встроенных секций (например, _vectors_end) распознаются без проблем.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
klen
сообщение May 23 2011, 10:06
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



предлагаю сделать чуток иначе.

объявляете в скрипте линкера секцию
Код
MEMORY
{
  flash   (rx)  : ORIGIN = ....., LENGTH = ....
  metrology (rx) : ORIGIN = 0xB000, LENGTH=.....
  ram    (rwx)  : ORIGIN =.....,   LENGTH = ....
  ..............

  ..............
}

SECTIONS
{
    . = 0;    
                                
    .text :
       {
        ..........................
       } >flash
        .metrology
      {
          __start_metrology = .
          *(.metrology)
      *(.metrology*)
         __stop_metrology = .
      } >flash



Цитата
PS; что характерно, идентификаторы встроенных секций (например, _vectors_end) распознаются без проблем.

эта характерность станет очевидной если вы взглянене в скрипт линкера - я телепатически уверен что там описана секция vectors с метками границ секции, они становятся доступны при линковке, пример сверху эту очевидность прикручиваетк Вашей секции.

Вам тупо нада разобратся как работает линкер и поковырятся в скрипте. если неполучится сообщайте.
Go to the top of the page
 
+Quote Post
Axel
сообщение May 23 2011, 10:08
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Попробуйте так:
Код
unsigned short *addr_start = (unsigned short *)((unsigned short)(&_start_metrology))


Сообщение отредактировал IgorKossak - May 23 2011, 12:50
Причина редактирования: Тэг [code] для короткого кода!
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 23 2011, 10:11
Сообщение #4


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

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



Цитата(klen @ May 23 2011, 14:06) *
предлагаю сделать чуток иначе.

объявляете в скрипте линкера секцию...

Это понятно, но идеологически неправильно.
Да и размер заранее (как бы) неизвестен


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
klen
сообщение May 23 2011, 10:14
Сообщение #5


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(Axel @ May 23 2011, 14:08) *
Попробуйте так:
Код
unsigned short *addr_start = (unsigned short *)((unsigned short)(&_start_metrology))

мысль глубокая и интересная но вопрос остется открытым - а где линкеру брать адрес _start_metrology

Цитата(MrYuran @ May 23 2011, 14:11) *
Это понятно, но идеологически неправильно.
Да и размер заранее (как бы) неизвестен

вы же не сказали деталей ...
тогда смело вносите свою секцию как подсекцию .text и тогда все будет идеологически правильно
мне не совсем понятно зачем ее по фиксированному адресу размещать это раз
размер заранее известен - верхний край флеша! это два
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 23 2011, 10:15
Сообщение #6


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

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



Цитата(klen @ May 23 2011, 14:12) *
мысль глубокая и интересная но вопрос остется открытым - а где линкеру брать адрес _start_metrology

Интересный тогда вопрос - а кто размещает секции, разве не он?
Ведь функции размещены где надо, с адреса B000.
Почему при размещении функций адрес известен, а при обращении к _start_metrology - нет?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
klen
сообщение May 23 2011, 10:15
Сообщение #7


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(MrYuran @ May 23 2011, 14:15) *
Интересный тогда вопрос - а кто размещает секции, разве не он?
Ведь функции размещены где надо, с адреса B000.
Почему при размещении функций адрес известен, а при обращении к _start_metrology - нет?

линкер не размещает - он кладет туда куда Вы разместили их в скрипте линкера

ну ж написал - _start_metrology не объявлена в скрипте линкера! он ниоткуда не выдумывается линкером. иначе я бы мог сказать '' а почему при обращении к _super_puper_mega_start__metrology тоже проблемы какието ". это ВЫ!!! должны _start_metrology определить.
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 23 2011, 10:16
Сообщение #8


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(MrYuran @ May 23 2011, 14:15) *
Интересный тогда вопрос - а кто размещает секции, разве не он?
Ведь функции размещены где надо, с адреса B000.
Почему при размещении функций адрес известен, а при обращении к _start_metrology - нет?


может быть дело в количестве подчеркиваний перед start и stop ?
В первом сообщении у вас их было два.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Axel
сообщение May 23 2011, 10:18
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата(klen @ May 23 2011, 13:14) *
мысль глубокая и интересная но вопрос остется открытым - а где линкеру брать адрес _start_metrology


Без проблем находит... С Crossworks'ом я такое часто пользую.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 23 2011, 10:19
Сообщение #10


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

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



Цитата(klen @ May 23 2011, 14:14) *
тогда смело вносите свою секцию как подсекцию .text и тогда все будет идеологически правильно

Как это сделать?


Цитата(dimka76 @ May 23 2011, 14:16) *
может быть дело в количестве подчеркиваний перед start и stop ?
В первом сообщении у вас их было два.

Нет, уже пробовали. sm.gif
Как и различные приведения типов.

Таки придётся линкер изучать sad.gif


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
klen
сообщение May 23 2011, 10:19
Сообщение #11


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(Axel @ May 23 2011, 14:18) *
Без проблем находит... С Crossworks'ом я такое часто пользую.

ну если у вас оно само работает то я значит ничего не понимаю. sad.gif


2_MrYuran
добавте в описание вотэто;

.text
{
..........
.metrology
{
__start_metrology = . /* объявление символа адрес которого будет при линковке доступен по имени */
*(.metrology) /* сюда линкер сложит код с атрибутом секции metrology */
*(.metrology*) /* сюда линкер сложит код с атрибутом секции metrology */
__stop_metrology = . /* объявление символа адрес которого будет при линковке доступен по имени */
..........
}

должно работать. тока теперь адрес начала не фиксированнный . хотя в принципе можно попробываить уговорить сделать дыру в прошивке.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 23 2011, 10:25
Сообщение #12


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

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



Ладно, начинаем по порядку.
Код
LDFLAGS += -Wl,--section-start
LDFLAGS += -Wl,.metrology=0xB000


Объявляем линкеру собственную секцию и привязываем её к фиксированному адресу.
Собственно, с этого момента у него вся инфа есть. (ну разве что конец подсчитать после размещения всех функций).


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
klen
сообщение May 23 2011, 10:28
Сообщение #13


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(MrYuran @ May 23 2011, 14:25) *
Ладно, начинаем по порядку.
Код
LDFLAGS += -Wl,--section-start
LDFLAGS += -Wl,.metrology=0xB000


Объявляем линкеру собственную секцию и привязываем её к фиксированному адресу.
Собственно, с этого момента у него вся инфа есть. (ну разве что конец подсчитать после размещения всех функций).

я с командной строки ничего так незасовывал линкеру - все чеерз скрипт - теже яйца но документально оформленные в виде файла, по идее должно работать но мне не очевидно как указать какой секции соответствует --section-start... я их могу в командной строке передать милион и секций и символов - где соответствие, потом я не вижу объявление символа конца секции... советую не морочить себе голову сделать через скрипт а когда появится свободное время разобратся в косяках
Go to the top of the page
 
+Quote Post
Axel
сообщение May 23 2011, 10:33
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Работающий код:
Код
gAppParamPage = ((u32)&__FLASH_segment_used_end__ + FLASH_PAGE_SIZE) & ~(FLASH_PAGE_SIZE - 1);


В .map:
Код
__FLASH_segment_used_end__ = (ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) + SIZEOF (.data))


Собирается без проблем.

Сообщение отредактировал IgorKossak - May 23 2011, 12:50
Причина редактирования: Тэг [code] для короткого кода!
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 23 2011, 10:36
Сообщение #15


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

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



Цитата(klen @ May 23 2011, 14:28) *
советую не морочить себе голову сделать через скрипт а когда появится свободное время разобратся в косяках

Посоветуйте ещё, где по скриптам линкера толковая инфа.
Желательно прямой ссылкой.
Thnks.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:50
Рейтинг@Mail.ru


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