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

 
 
 
Reply to this topicStart new topic
> Конфигурация линкера для массивов
mantech
сообщение Jun 7 2018, 07:41
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Приветствую.

В процессе работы над программой заметил, что все массивы, особенно большие (более 8к) заметно увеличивают размер выходного бинарника, т.к. находятся внутри тела программы. Скорее всего это потому, что в линкере все объявлено в одну секцию. Может кто более опытный в этом деле посоветует, как "вынести" все эти массивы и структуры за тело программы, как в ИАРе делалось, и второе, каким образом будут инициализироваться эти данные, компилятор сам вставляет процедуры заполнения константой(как делал ИАР) или мне надо писать их самостоятельно?

Файл линкера:

CODE
MEMORY
{
RAM (XRW) : ORIGIN = 0x40000000, LENGTH = 0x000A0000 /* 1MB */
}

SECTIONS
{
.start : { *(.start) } > RAM
.text : { *(.text) } > RAM
.bss : { *(.bss) } > RAM
.ivc : {. = ALIGN(32); *(.ivc) *(.rodata)} >RAM

.stack : {. = ALIGN(512);__StackLimit = . ;*(.stack*). = . + 0x4500; __StackTop = .;} >RAM
_stack = __StackTop;


.fill :
{
FILL(0x00);
. = ORIGIN(RAM) + 0x8ffff;
BYTE(0x00);
} > RAM




/DISCARD/ : { *(.dynstr*) }
/DISCARD/ : { *(.dynamic*) }
/DISCARD/ : { *(.plt*) }
/DISCARD/ : { *(.interp*) }
/DISCARD/ : { *(.gnu*) }
/DISCARD/ : { *(.note*) }
}

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 7 2018, 08:33
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Неинициализированные данные попадают в секцию bss.

Попробуйте добавить атрибут (NOLOAD) к секции bss:

Код
    .bss (NOLOAD):



--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 7 2018, 08:37
Сообщение #3


Гуру
******

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



Цитата(mantech @ Jun 7 2018, 10:41) *
Может кто более опытный в этом деле посоветует, как "вынести" все эти массивы и структуры за тело программы, как в ИАРе делалось,

Что значит вынести? Если массивы содержат данные, то где им еще располагаться? Лучше приложить .map и показать, что в нем не устраивает.

Цитата(mantech @ Jun 7 2018, 10:41) *
и второе, каким образом будут инициализироваться эти данные, компилятор сам вставляет процедуры заполнения константой(как делал ИАР) или мне надо писать их самостоятельно?

Копировать и инициализировать нулями придется самостоятельно.
Go to the top of the page
 
+Quote Post
mantech
сообщение Jun 7 2018, 10:27
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(aaarrr @ Jun 7 2018, 11:37) *
Что значит вынести? Если массивы содержат данные, то где им еще располагаться? Лучше приложить .map и показать, что в нем не устраивает.


Копировать и инициализировать нулями придется самостоятельно.


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

Цитата(AHTOXA @ Jun 7 2018, 11:33) *
Неинициализированные данные попадают в секцию bss.

Попробуйте добавить атрибут (NOLOAD) к секции bss:

Код
    .bss (NOLOAD):


Сомнительно, можно попробовать, но я думаю, что это из-за этого
.bss : { *(.bss) } > RAM
Если правильно понимаю, это означает поместить в общий регион RAM...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th April 2024 - 07:44
Рейтинг@Mail.ru


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