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

    

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

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

 

В процессе работы над программой заметил, что все массивы, особенно большие (более 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...

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация