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

 
 
 
Reply to this topicStart new topic
> Рзмер скомпиленного образа в переменную, Автоматом, средствами ИАР.
elektronshik
сообщение Aug 14 2009, 07:02
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 25-10-07
Из: Тольятти
Пользователь №: 31 723



Добрый день.
Вот пишу вторичный загрузчик LPC2368, возникла необходимость подставлять размер образа в код программы. Естественно заранее он не известен, но после линковки выводится в сообщении:
X bytes of readonly code memory
Y bytes of readonly data memory
Z bytes of readwrite data memory

Вот этими X Y Z надо инициализировать какие нибудь переменные в коде (получается, что уже после линковки).

В некоторых компиляторах это вроде работает (видел строки наподобие "U32 Size = Image$$ER_IROM$$RO$$Length"), а вот как в ИАР это сделать?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 14 2009, 10:29
Сообщение #2


Гуру
******

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



Цитата(elektronshik @ Aug 14 2009, 10:02) *
В некоторых компиляторах это вроде работает (видел строки наподобие "U32 Size = Image$$ER_IROM$$RO$$Length"), а вот как в ИАР это сделать?
Скриптом линкера колдовать. Т.е. эту информацию может подставить линкер. У 4.хх через ключ -D, у более новых - не знаю.


--------------------
На любой вопрос даю любой ответ
"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
zltigo
сообщение Aug 14 2009, 10:49
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(elektronshik @ Aug 14 2009, 09:02) *
Вот пишу вторичный загрузчик LPC2368, возникла необходимость подставлять размер образа в код программы.

Для этого существуют фиктивные переменные типа RAMSTART, RAMEND.... и иже с ними - можете спросить их адрес smile.gif. Соответственно можете и свои сегменты-переменные создать, залинковать их куда хотите и пользоваться. Можете инфомацию о сегментах получить типа __segment_begin(). Документацию, короче, посмотреть.
P.S.
Вообще, почему каждый, кто решил написать загрузчик задает вопросы заново???


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
elektronshik
сообщение Aug 20 2009, 07:48
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 25-10-07
Из: Тольятти
Пользователь №: 31 723



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

CSTACK 0x0 (0)
IRQ_STACK 0x200 (512)
SVC_STACK 0x200 (512)
.vectors 0x40 (64)
.cstartup 0xFC (252)
HEAP 0x1000 (4096)
.text 0x827C (33404)
.rodata 0x3287 (12935)
ICODE 0xE0 (224)
.iar.init_table 0x0 (0)
.bss 0x574 (1396)
.data 0x1B4 (436)
.iar.dynexit 0x300 (768)

В .map - файле:
33944 bytes of readonly code memory
13189 bytes of readonly data memory
7 721 bytes of readwrite data memory

33944 +13189 = 47133, а сам бинарик весит 47134 байт - то есть даже с .map расхождение.
Из каких же секций он складывается?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 20 2009, 07:56
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(elektronshik @ Aug 20 2009, 09:48) *
Из каких же секций он складывается?

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
elektronshik
сообщение Aug 20 2009, 08:41
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 25-10-07
Из: Тольятти
Пользователь №: 31 723



Цитата(zltigo @ Aug 20 2009, 11:56) *
1.Секции располагаются в памяти соответствии с заданными Вами же требованиями по их выравниваю.
2.Ума не приложу, зачем нужно знать из размер, а не просто конечный результат.

И как же узнать конечный результат (я так понимаю, Вы имели ввиду размер бинарика)?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 20 2009, 09:22
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(elektronshik @ Aug 20 2009, 10:41) *
И как же узнать конечный результат

Отвечал. Например, контрольную сумму положить в отдельный сегмент и прилинковать его последним - и конец, и сумма в одном флаконе smile.gif
Какие проблемы?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
elektronshik
сообщение Aug 20 2009, 12:16
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 25-10-07
Из: Тольятти
Пользователь №: 31 723



Цитата(zltigo @ Aug 20 2009, 13:22) *
Отвечал. Например, контрольную сумму положить в отдельный сегмент и прилинковать его последним - и конец, и сумма в одном флаконе smile.gif
Какие проблемы?

Спасибо, теперь понял!
Go to the top of the page
 
+Quote Post
elektronshik
сообщение Aug 21 2009, 05:07
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 25-10-07
Из: Тольятти
Пользователь №: 31 723



И все равно не получается smile3046.gif: Пытаюсь разместить специально созданную секцию в самом конце, но при линковке выскакивает ругательство:

Tool Internal Error:
Internal Error: [CoreUtil/General]: Access violation (0xc0000005) at 00618DCA (reading from address 0x0)

Кажется это изза того, что ИАР пытается расположить обязательно в конце какие-то служебные данные.
Вот краткое содержание .map файла:
Код
"P1":  place in [from mem:0x0 to mem:0x7ffff] { ro section .vectors };
"P2":  place in [from mem:0x0 to mem:0x7ffff] { ro section .cstartup };
"P3":  place in [from mem:0x0 to mem:0x7ffff] { block _RO_ALL_ };
"P4":  place in [from mem:0x40000000 to mem:0x40007fff] {
          block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK,
          block UND_STACK, block ABT_STACK, block HEAP };
"P5":  place in [from mem:0x40000000 to mem:0x40007fff] { block _RW_ALL_ };

  Section              Kind        Address    Size  Object
  -------              ----        -------    ----  ------
"P1":                                         0x40
  .vectors                      0x00000000    0x40  <Block>
    .vectors           ro code  0x00000000    0x40  vectors.o [1]
                              - 0x00000040    0x40

"P2":                                         0xfc
  .cstartup                     0x00000040    0xfc  <Block>
    .cstartup          ro code  0x00000040    0xfc  cstartup.o [1]
                              - 0x0000013c    0xfc

"P3":                                       0xb6ee
  _RO_ALL_                      0x0000013c  0xb6ee  <Block>
    .iar.init_table    const    0x0000013c    0x2c  - Linker created -
    .rodata                     0x00000168  0x3287  <Block>
      ...........................................................................
...........
      .rodata          const    0x000033ee     0x1  xlocale_c.o [3]
    .text                       0x000033f0  0x8288  <Block>
      ...........................................................................
................
      .text            ro code  0x0000b590    0xe8  packbits_init2.o [4]
    ICODE                       0x0000b678    0xe0  <Block>
      ICODE            ro code  0x0000b678    0xe0  lowlevel.o [1]
    Initializer bytes  ro data  0x0000b758    0xd2  <for .data-1>
                              - 0x0000b82a  0xb6ee

Из него видно, что самой последней секцией конец которой я могу вычислить идет "ICODE", после него впихиваются некие "Initializer bytes"
Причем, если я в линкере пытаюсь разместить "ICODE" последней, вылетает вышеуказанная ошибка.

...Кажется "Initializer bytes" это на самом деле секция ".data_init", если её расположить последней, ошибок не возникает, но её конец (__section_end(".data_init")) почему то равен 0х4, хотя в map файле все правильно и её конец равен размеру образа.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 11:40
Рейтинг@Mail.ru


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