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

 
 
> GNU linker, .rodata and .data sections
RCray
сообщение Mar 26 2012, 16:20
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 14-09-05
Из: Suwon
Пользователь №: 8 548



Коллеги,

Часть глобальных данных хочу инициализировать ещё на этапе объявления. Ну там int32_t a[5] = {1, 2, 3, 4, 5}; А всю остальную часть глобальных данных хочу обнулить. Моя проблема в том, что секция с данными {1, 2, 3, 4, 5} и a[5] оказываются отдельно в разных секциях .rodata и .data соответсвенно. Существует ли какой-то способ сэкономить память и сразу их объеденить ещё на этапе линкования? Спасибо.


Сейчас использую такое описание в *.ld файле для линкера:

Код
MEMORY
{
   ...
   ...
   IntCodeRAM   (rx) : ORIGIN = 0x00080000, LENGTH = 128k
   IntDataRAM   (rw) : ORIGIN = 0x20000000, LENGTH = 112k
   ...
   ...
}

PROVIDE (initStart = _etext);

   /*******************************************/
   /* .rodata section for read-only data (constants) */

  .rodata . :
  {
    *(.rodata)
    *(.rodata.*)    
  . = ALIGN(4);
  _etext = .;
  PROVIDE (etext = .);

  } >IntCodeRAM


  /*******************************************/
  /* .data section for initialized data */

  .data  : AT (_etext)
  {
    /* used for initialized data */
    dataStart = .;
    PROVIDE (dataStart = .);
    *(.data)
       *(.data.*)    
      *(.gnu.linkonce.d*)

    SORT(CONSTRUCTORS)
    dataEnd = .;
    PROVIDE (dataEnd = .);
  } >IntDataRAM
  . = ALIGN(4);

  _edata = .;
   PROVIDE (edata = .);



    /*******************************************/
    /* .bss section for uninitialized data */
  .bss :
  {

    bssStart = .;
    bssStart = .;
    *(.bss)
    *(.gnu.linkonce.b*)    
    
    . = ALIGN(4);
    bssEnd = .;
        
  } >IntDataRAM


А потом для обнуления или инициализации глобальных данных константами использую в исходниках следующий код
Код
    
    /* initialize .data segment */
    src = &initStart;
    for(dst = &dataStart; dst < &dataEnd; )
    {
        *dst++ = *src++;
    }

    /* Zero fill the .bss segment. */
    for(dst = &bssStart; dst < &bssEnd; )
    {
        *dst++ = 0;
    }
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 15th July 2025 - 17:32
Рейтинг@Mail.ru


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