Jump to content

    
Sign in to follow this  
mantech

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

Recommended Posts

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

 

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

 

Share this post


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

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

 

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

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

Share this post


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

 

 

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

 

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

 

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

 

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

 

    .bss (NOLOAD):

 

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this