mantech 49 7 июня, 2018 Опубликовано 7 июня, 2018 · Жалоба Приветствую. В процессе работы над программой заметил, что все массивы, особенно большие (более 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*) } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 7 июня, 2018 Опубликовано 7 июня, 2018 · Жалоба Неинициализированные данные попадают в секцию bss. Попробуйте добавить атрибут (NOLOAD) к секции bss: .bss (NOLOAD): Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 7 июня, 2018 Опубликовано 7 июня, 2018 · Жалоба Может кто более опытный в этом деле посоветует, как "вынести" все эти массивы и структуры за тело программы, как в ИАРе делалось, Что значит вынести? Если массивы содержат данные, то где им еще располагаться? Лучше приложить .map и показать, что в нем не устраивает. и второе, каким образом будут инициализироваться эти данные, компилятор сам вставляет процедуры заполнения константой(как делал ИАР) или мне надо писать их самостоятельно? Копировать и инициализировать нулями придется самостоятельно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 7 июня, 2018 Опубликовано 7 июня, 2018 · Жалоба Что значит вынести? Если массивы содержат данные, то где им еще располагаться? Лучше приложить .map и показать, что в нем не устраивает. Копировать и инициализировать нулями придется самостоятельно. В том-то и дело, что в них данных на этапе запуска проги нет, некоторые должны быть очищены, остальные по барабану, что в них будет ... Неинициализированные данные попадают в секцию bss. Попробуйте добавить атрибут (NOLOAD) к секции bss: .bss (NOLOAD): Сомнительно, можно попробовать, но я думаю, что это из-за этого .bss : { *(.bss) } > RAM Если правильно понимаю, это означает поместить в общий регион RAM... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться