RISC-V линкер-сгенерированные секции Ошибка перекрытия LMA несмотря на принадлежность LMA к различным областям памяти - PullRequest
1 голос
/ 09 июня 2019

В моем файле компоновщика есть следующие описания областей памяти:

/*=============================
 * Memory region descriptions
 *=============================*/

MEMORY
{
  /*-------------------------------------
   * Virtual Memory Address (VMA) regions
   *-------------------------------------*/

  /* Local memory VMA */
  DMEM_VMA (rw) : ORIGIN = 0x1000, LENGTH = 4K

  /* DRAM text VMA */
  DRAM_T_VMA (rx) : ORIGIN = 0x0, LENGTH = 16M

  /* DRAM data VMA */
  DRAM_D_VMA (rw) : ORIGIN = 0x81000000, LENGTH = 2032M /* 2048M - 16M */


  /*----------------------------------
   * Load Memory Address (LMA) regions
   *----------------------------------*/

  /* Local memory LMA */
  DMEM_LMA (rw) : ORIGIN = 0x1000, LENGTH = 4K

  /* DRAM text LMA */
  DRAM_T_LMA (rx) : ORIGIN = 0x0, LENGTH = 16M

  /* DRAM data LMA */
  DRAM_D_LMA (rw) : ORIGIN = 0x01000000, LENGTH = 2032M
}



/*=============================
 * Output section descriptions
 *=============================*/

SECTIONS
{

  /*----------------------------------
   * DMEM output sections
   *----------------------------------*/

  /* data segment */
  .data.dmem : { 
    *(.data) 
  } >DMEM_VMA AT>DMEM_LMA

  .sdata.dmem : {
    _gp = . + 0x800;
    *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata*)
    *(.sdata .sdata.* .gnu.linkonce.s.*)
  } >DMEM_VMA AT>DMEM_LMA


  /* bss segment */
  .sbss.dmem : {
    *(.sbss .sbss.* .gnu.linkonce.sb.*)
    *(.scommon)
  } >DMEM_VMA AT>DMEM_LMA

  .bss.dmem : { 
    *(.bss) 
  } >DMEM_VMA AT>DMEM_LMA


  /* thread-local data segment */
  .tdata.dmem : {
    _tls_data = .;
    *(.tdata)
    *(.tdata*)
  } >DMEM_VMA AT>DMEM_LMA

  .tbss.dmem : {
    *(.tbss)
    *(.tbss*)
  } >DMEM_VMA AT>DMEM_LMA


  /* read-only data */
  .rodata.dmem : { 
    *(.rodata) 
    *(.rodata*) 
  } >DMEM_VMA AT>DMEM_LMA


  .eh_frame.dmem : { 
    *(.eh_frame) 
    *(.eh_frame*) 
  } >DMEM_VMA AT>DMEM_LMA


  /* striped data */
  /* RISC-V 32 has a 4 byte word size */
  .striped.data.dmem ALIGN(bsg_group_size * 4): {
    _bsg_striped_data_start = . ;
    *(.striped.data)
  } >DMEM_VMA AT>DMEM_LMA


  /*----------------------------------
   * DRAM output sections
   *----------------------------------*/

  .text.dram : {
     *crt.o(.text)
     *(.text)
     *(.text.startup)
  } >DRAM_T_VMA AT>DRAM_T_LMA

  .data.dram : {
    *(.dram)
  } >DRAM_D_VMA AT>DRAM_D_LMA
}

У нас есть две разные области, называемые DMEM и DRAM, и они физически разные воспоминания в нашей архитектуре. Но я сталкиваюсь со следующей ошибкой для некоторых программ, которые пытаюсь связать с помощью этого скрипта связи:

riscv32-unknown-elf/bin/ld: section .data.dmem LMA [0000000000001000,000000000000100f] overlaps section .text.dram LMA [0000000000000000,0000000000001e4f]
collect2: error: ld returned 1 exit status

Я запутался, почему компоновщик жалуется на перекрытие между двумя разными регионами LMA! Любые подсказки для отладки это было бы очень полезно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...