Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Скрипт линкера gcc
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Kris2007
Поправил написанный до меня скрипт линкера для атмега256 и поместил строки в конце памяти программ микроконтроллера.
В результате все генерится правильно ести строки определенный длины а если добавлю/уберу одну букву то секцию const_str линкер считает незагружаемой в память контроллера.
Чую что то с ALIGN() т.к. не совсем понимаю зачем он и к чему.

Поскажите как поправить и насколько правильно я создал секцию const_str (еще с линкером не работал).
Код
*
* Linker script for ATmega2561 - binutils 2.13
*/
/* Default linker script, for normal executables */
OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr")
OUTPUT_ARCH(avr:6)
MEMORY
{
  text   (rx)   : ORIGIN = 0,    LENGTH = 256K
  data   (rw!x) : ORIGIN = (0x800000 + 0x200), LENGTH = 8192
  eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 4K
}
SECTIONS
{
  /* Read-only sections, merged into text segment: */
  .hash          : { *(.hash) }
  .dynsym        : { *(.dynsym) }
  .dynstr        : { *(.dynstr) }
  .gnu.version   : { *(.gnu.version) }
  .gnu.version_d   : { *(.gnu.version_d) }
  .gnu.version_r   : { *(.gnu.version_r) }
  .rel.init      : { *(.rel.init) }
  .rela.init     : { *(.rela.init) }
  .rel.text      :
    {
      *(.rel.text)
      *(.rel.text.*)
      *(.rel.gnu.linkonce.t*)
    }
  .rela.text     :
    {
      *(.rela.text)
      *(.rela.text.*)
      *(.rela.gnu.linkonce.t*)
    }
  .rel.fini      : { *(.rel.fini) }
  .rela.fini     : { *(.rela.fini) }
  .rel.rodata    :
    {
      *(.rel.rodata)
      *(.rel.rodata.*)
      *(.rel.gnu.linkonce.r*)
    }
  .rela.rodata   :
    {
      *(.rela.rodata)
      *(.rela.rodata.*)
      *(.rela.gnu.linkonce.r*)
    }
  .rel.data      :
    {
      *(.rel.data)
      *(.rel.data.*)
      *(.rel.gnu.linkonce.d*)
    }
  .rela.data     :
    {
      *(.rela.data)
      *(.rela.data.*)
      *(.rela.gnu.linkonce.d*)
    }
  .rel.ctors     : { *(.rel.ctors) }
  .rela.ctors    : { *(.rela.ctors) }
  .rel.dtors     : { *(.rel.dtors) }
  .rela.dtors    : { *(.rela.dtors) }
  .rel.got       : { *(.rel.got) }
  .rela.got      : { *(.rela.got) }
  .rel.bss       : { *(.rel.bss) }
  .rela.bss      : { *(.rela.bss) }
  .rel.plt       : { *(.rel.plt) }
  .rela.plt      : { *(.rela.plt) }
  /* Internal text space or external memory */
  .text :
  {
    *(.init) /* Start here after reset.  */
    *(.progmem.gcc*)
    . = ALIGN(2);
    *(.trampolines*)
    *(.init1)
    *(.init2) /* Clear __zero_reg__, set up stack pointer.  */
    *(.init3)
    *(.init4) /* Initialize data and BSS.  */
    *(.init5)
    *(.init6) /* C++ constructors.  */
    *(.init7)
    *(.init8)
    *(.init9) /* Call main().  */
    *(.text)
    *(.vk)
    . = ALIGN(2);
    *(.text.*)
    . = ALIGN(2);
    *(.fini)
     _etext = .;
  }  > text
  .data  : AT (ADDR (.text) + SIZEOF (.text))
  {
     PROVIDE (__data_start = .);
    *(.data)
    *(.gnu.linkonce.d*)
    . = ALIGN(2);
     _edata = .;
    PROVIDE (__data_end = .);
  }  > data
  .bss  SIZEOF(.data) + ADDR(.data) :
  {
    *(.ly)
     PROVIDE (__bss_start = .);
    *(.bss)
    *(COMMON)
     PROVIDE (__bss_end = .);
     _end = .;
  }  > data
  __data_load_start = LOADADDR(.data);
  __data_load_end = __data_load_start + SIZEOF(.data);
  .eeprom  :
AT (ADDR (.text) + SIZEOF (.text) + SIZEOF (.data))
  {
    *(.eeprom*)
     __eeprom_end = .;
  }  > eeprom

  /* Const string 232 - 248kb */
  .const_str 0x3A000 : AT (0x3A000)
  {
    *(.progmem*)
    . = ALIGN(2);
  }  > text

  /* Stabs debugging sections.  */
,,,,,


avr-objdump -h . Изчез LOAD у const_str:
Код
fxosfw.out:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .data         0000002e  00800200  00004262  000042f6  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  1 .text         00004262  00000000  00000000  00000094  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .bss          00000729  0080022e  0080022e  00004324  2**0
                  ALLOC
  3 .const_str    000002f6  0003a000  0003a000  00004a4d  2**0
                  CONTENTS, READONLY
  4 .stab         0000a0bc  00000000  00000000  00004d44  2**2
                  CONTENTS, READONLY, DEBUGGING
  5 .stabstr      000079e7  00000000  00000000  0000ee00  2**0
                  CONTENTS, READONLY, DEBUGGING
Kris2007
Но неужели никто не писал скриптов?! sad.gif

Добавил в const_str вместо ALIGN(2) ALIGN(3E000)- выравнил по границе(248кб) памяти программ. Все собирается конечно...но почему собиралось через раз до этого мне не понятно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.