Мне нужно создать статический 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
?