Создание спецификационных заголовков программы c с использованием сценария компоновщика - PullRequest
0 голосов
/ 29 апреля 2020

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

Program Header:
    LOAD off    0x0000000000000000 vaddr 0x0000000000400000 paddr 0x0000000000400000 align 2**12
         filesz 0x00000000000000e8 memsz 0x00000000000000e8 flags r--
    LOAD off    0x0000000000001000 vaddr 0x0000000000401000 paddr 0x0000000000401000 align 2**12
         filesz 0x0000000000000035 memsz 0x0000000000000035 flags r-x
    LOAD off    0x0000000000000000 vaddr 0x0000000000402000 paddr 0x0000000000402000 align 2**12
         filesz 0x0000000000000000 memsz 0x0000000000000008 flags rw-

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         00000035  0000000000401000  0000000000401000  00001000  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .bss          00000001  0000000000402000  0000000000402000  00002000  2**0
                  ALLOC

Первый сегмент должен содержать заголовки ELF, второй сегмент должен содержать код , а третий сегмент должен содержать общие данные. У меня уже есть необходимые объектные файлы, и мне нужно только связать их.

Я пытаюсь использовать для этого сценарии компоновщика, в частности, PHDRS и SECTIONS команд. До сих пор я придумал следующее:

PHDRS {
    elf PT_LOAD FILEHDR PHDRS FLAGS(4);
    text PT_LOAD FLAGS(5);
    bss PT_LOAD FLAGS(6);
}

SECTIONS {
    .text 0x401000: { *(.text) } :text
    .bss 0x402000: { *(.bss) *(COMMON) } :bss
    /DISCARD/ : { *(*) }
}

Это правильно производит второй и третий сегменты, а также оба раздела, однако, vaddr первого сегмента заканчивается 0:

    LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**12
         filesz 0x00000000000000e8 memsz 0x00000000000000e8 flags r--

Очевидно, я не указал его адрес, однако, похоже, нет подходящего места для этого. Например, присвоения . действительны только в пределах SECTIONS. Команда AT влияет только на paddr. Наконец, добавление пустого пустого раздела с помощью трюка . = . :

    .elf 0x400000: { . = .; } :elf

не помогает: раздел появляется, но сегмент все еще находится в vaddr 0.

Есть ли способ указать vaddr для сегмента FILEHDR / PHDRS?

...