ledger_device_sdk 1.20.1

Ledger device Rust SDK
PHDRS
{
  flash0 PT_LOAD ;
  data   PT_LOAD ;
  flash2 PT_LOAD ;
  sram PT_LOAD ;

  headers PT_PHDR PHDRS ;
}

SECTIONS
{
  /* Code, read only, no relocations needed. */
  .text :
  {
    _text = .;
    /* Here begins flash. This symbol is used by the ideompotent `pic`
       function as the lower bound of addressed to relocate. */
    _nvram_start = .;

    *(.boot*)
    *(.text*)
    /* .rodata is moved out so we can update it */

    . = ALIGN(PAGE_SIZE);
    _etext = .;
  } > FLASH :flash0

  /* Relocations, read only, no relocations aginst the relocations themselves
     needed! */
  _reloc_size = SIZEOF(.rel.rodata) + SIZEOF(.rel.data) + SIZEOF(.rel.nvm_data);
  .rel_flash : ALIGN(PAGE_SIZE)
  {
    _relocs = .;

    . += _reloc_size;
    . = ALIGN(PAGE_SIZE);

    _erelocs = .;

    . = ALIGN(PAGE_SIZE);

    /* After this section we have mutable flash. Must be a multiple of PAGE_SIZE from _nvram_start. */
    _nvram_data = .;
  } > FLASH :flash0

  /* Immutable globals, read only during app running proper, but
     relocations are needed. (So not read-only completely.) */
  .rodata : ALIGN(PAGE_SIZE)
  {
    /* Moved here from .text so we can permantly apply relocations to it with
       nvm_write() */
    . = ALIGN(PAGE_SIZE);
    _rodata = .;
    _rodata_src = .;
    *(.rodata*)
    . = ALIGN(PAGE_SIZE);
    _erodata = .;
  } > FLASH :flash0
  _rodata_len = _erodata - _rodata;

  /* Mutable Globals, writable, relocations are needed. */
  .data : ALIGN(4)
  {
    _data = .;
    *(vtable)
    *(.data*)
    . = ALIGN(PAGE_SIZE);
    _edata = .;
  } > SRAM AT> FLASH :data =0xa4a4
  _data_len = SIZEOF(.data);

  ASSERT( (_edata - _data) <= 0, ".data section must be empty" )

  /* Persistent data, read and written during app running proper,
     relocations are also needed. */
  .nvm_data : ALIGN(PAGE_SIZE)
  {
    _nvm_data_start = .;
    *(.nvm_data*)

    /* Store _nvram value during link_pass and use this to detect movement of
       _nvram as compared to the previous app execution, and redo the relocations
       if necessary */
    . = ALIGN(4);
    _nvram_prev_run = .;
    LONG(ABSOLUTE(_nvram_start))

    . = ALIGN(PAGE_SIZE);

    /* After this section we no longer have Flash memory at all. */

    /* This symbol is used by the mutable portion of flash calculations. */
    _envram_data = .;
    _install_parameters = .;
    /* This symbol is used by the ideompotent `pic` function as the upper
       bound of addressed to relocate. */
    _nvram_end = .;
  } > FLASH :flash2

  _sidata_src = LOADADDR(.data);

  .bss :
  {
    _bss = .;
    *(.bss*)
    _ebss = .;
    _bss_len = ABSOLUTE(_ebss) - ABSOLUTE(_bss);

    . = ALIGN(4);
    app_stack_canary = .;
    . += 4;
    _stack_validation = .;
    . = _stack_validation + STACK_SIZE;
    _stack = ABSOLUTE(END_STACK) - STACK_SIZE;
    _estack = ABSOLUTE(END_STACK);
  } > SRAM :sram

  .stack_sizes (INFO):
  {
    KEEP(*(.stack_sizes));
  }

  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
    *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    *(.debug_info)
  }

  ledger.target (INFO): { KEEP(*(ledger.target)) }
  ledger.target_id (INFO): { KEEP(*(ledger.target_id)) }
  ledger.target_name (INFO): { KEEP(*(ledger.target_name)) }
  ledger.app_name (INFO): { KEEP(*(ledger.app_name)) }
  ledger.app_version (INFO): { KEEP(*(ledger.app_version)) }
  ledger.api_level (INFO): { KEEP(*(ledger.api_level)) }
  ledger.sdk_version (INFO): { KEEP(*(ledger.sdk_version)) }
  ledger.rust_sdk_version (INFO): { KEEP(*(ledger.rust_sdk_version)) }
  ledger.rust_sdk_name (INFO): { KEEP(*(ledger.rust_sdk_name)) }
  ledger.sdk_name (INFO): { KEEP(*(ledger.sdk_name)) }
  ledger.sdk_hash (INFO): { KEEP(*(ledger.sdk_hash)) }
}

PROVIDE(_nvram = ABSOLUTE(_nvram_start));
PROVIDE(_envram = ABSOLUTE(_nvram_end));