Компоновщик GNU - Как заполнить неиспользуемое пространство памяти

Некоторые разделы в моей программе расположены в разных местах памяти, и есть несколько неиспользуемых участков памяти. Следующее - часть объектного файла моей программы:

a0000128:   20cf8f93            addi    t6,t6,524 # a0000330 <region_1>
a000012c:   000f8067            jr  t6

Disassembly of section .fill:

00000000a0000130 <_end-0x800290>:
    a0000130:   deaa                    sw  a0,124(sp)
    a0000132:   c0ad                    beqz    s1,a0000194 <_start+0x194>
    a0000134:   dede                    sw  s7,124(sp)
    a0000136:   c0ad                    beqz    s1,a0000198 <_start+0x198>
    ...

Disassembly of section .s_region_1:

00000000a0000330 <region_1>:
    a0000330:   00400f97            auipc   t6,0x400
    a0000334:   00cf8f93            addi    t6,t6,12 # a040033c <region_2>
    a0000338:   000f8067            jr  t6

Как показано, инструкция по адресу 0xa000012c переходит к другой инструкции по адресу 0xa0000330. Поскольку есть неиспользуемые участки памяти, я использовал команду FILL в скрипте компоновщика. Однако соответствующий HEX-файл (сгенерированный с помощью objcopy -O verilog) не включает машинный код region_1. То есть файл HEX включает только раздел .text и данные, которые используются для заполнения неиспользуемой области памяти:

13 0F 00 00 9B 0F 10 00 93 9F FF 01 1B 08 F0 FF 
13 18 38 03 13 08 18 04 13 18 C8 00 13 08 98 12 
73 10 18 30 97 0F 00 00 93 8F CF 20 67 80 0F 00 
@A0000130
AA DE AD C0 DE DE AD C0 DE DE AD C0 DE DE AD C0 
DE DE AD C0 DE DE AD C0 DE DE AD C0 DE DE AD C0 
DE DE AD C0 DE DE AD C0 DE DE AD C0 DE DE AD C0 
DE DE AD C0 DE DE AD C0 DE DE AD C0 DE DE AD C0 
...

Ниже приводится содержание скрипта компоновщика:

SECTIONS
{
  . = 0xA0000000;
  .text : { *(.text) }
.fill :
{
    FILL(0xDEADC0DE);
    BYTE(0xAA); 
    . = . + 0x1FF;
}
.s_region_1 : { *(s_region_1) }
.bss : { *(.bss) }
_end = .;
}

Что не так с приведенным выше сценарием компоновщика?

Это карта памяти, которую я хочу создать:

/*************************/





            .text





/*************************/



    /* EMPTY REGION */



/*************************/



        .section_1



/*************************/

person yildizabdullah    schedule 09.10.2020    source источник


Ответы (1)


Я заметил, что мне нужно добавить флаги aw в мой код сборки при определении раздела:

.section ".sregion1","aw"
region_1:
    la x31, region_2
    jr x31

После добавления флагов aw файл HEX был сгенерирован objcopy, как и ожидалось:

@80000000
1B 00 10 00 13 10 F0 01 B7 F0 0F 00 9B 80 70 81 
93 90 C0 00 93 80 90 A5 13 01 80 00 93 01 80 00 
1B 02 10 00 13 12 F2 01 B7 B2 0F 00 9B 82 12 FB
...
@80400130
97 0F 00 00 93 8F CF 00 67 80 0F 00 97 0F 00 00 
93 8F 0F 00 67 80 0F 00

Ниже представлена ​​последняя версия моего файла компоновщика:

OUTPUT_ARCH( "riscv" )
ENTRY(_start)

/*
MEMORY {
       text (RX): o = 0x80000000, LENGTH = 128M
       s_region_1 (RX): o = 0x80400000, LENGTH = 256K
}
*/

SECTIONS
{

  . = 0x80000000;
  .text :
  {
    *(.text);
    
  }

  . = . + 0x400000;
  .sregion1 : { *(.sregion1) }
  . = . + 0x400000;
  .bss : { *(.bss) }
  _end = .;
}
person yildizabdullah    schedule 19.10.2020