Перейти к содержанию
    

Конфигурация линкера для массивов

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

 

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

 

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

 

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*)    }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

    .bss (NOLOAD):

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кто более опытный в этом деле посоветует, как "вынести" все эти массивы и структуры за тело программы, как в ИАРе делалось,

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

 

и второе, каким образом будут инициализироваться эти данные, компилятор сам вставляет процедуры заполнения константой(как делал ИАР) или мне надо писать их самостоятельно?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

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

 

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

 

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

 

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

 

    .bss (NOLOAD):

 

Сомнительно, можно попробовать, но я думаю, что это из-за этого

.bss : { *(.bss) } > RAM

Если правильно понимаю, это означает поместить в общий регион RAM...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...