Onde está o "para mapeamento do segmento" armazenados em arquivos ELF?
-
21-12-2019 - |
Pergunta
Como parte de tentar escrever um compilador completamente a partir do zero, atualmente estou trabalhando na parte alças ELF arquivos.
Depois de folhear vários artigos e especificações sobre eles, eu ainda não entendo muito bem onde seção para o segmento de mapeamentos são armazenados.Ao observar pequenos executáveis gerados pelo normativa nasm+ld, eu posso ver o que da .texto secção de alguma forma, é mapeada para uma CARGA de programa do tipo de cabeçalho, mas como?
Um pequeno pedaço de readelf de saída quando recebe uma pequena (de trabalho), executável como entrada:
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x0000000000000084 0x0000000000000084 R E 200000
Section to Segment mapping:
Segment Sections...
00 .text
É este o mapeamento do mesmo necessário ter um executável de trabalho?Ou eles podem ser omitidas completamente e você ainda teria um executável válido?
Solução
Eu ainda não entendo muito bem onde seção para o segmento de mapeamentos são armazenados.
Eles são não armazenado em qualquer lugar.
Em vez disso, readelf
calcula o mapeamento olhando deslocamento de arquivo e o tamanho das seções e segmentos.
Outras dicas
Eu fiz um teste de acordo com o @Empregado russo.
readelf -l ./libandroid_servers.então,
Elf file type is DYN (Shared object file)
Entry point 0x0
There are 6 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x00000034 0x00000034 0x000c0 0x000c0 R 0x4
LOAD 0x000000 0x00000000 0x00000000 0x0f830 0x0f830 R E 0x1000
LOAD 0x010000 0x00010000 0x00010000 0x00cf4 0x011ac RW 0x1000
DYNAMIC 0x010540 0x00010540 0x00010540 0x00130 0x00130 RW 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0
EXIDX 0x00f2e8 0x0000f2e8 0x0000f2e8 0x00548 0x00548 R 0x4
Section to Segment mapping:
Segment Sections...
00
01 .hash .dynsym .dynstr .rel.plt .rel.dyn .plt .text .rodata .ARM.extab .ARM.exidx
02 .init_array .fini_array .data.rel.ro .dynamic .got .data .bss
03 .dynamic
04
05 .ARM.exidx
01 CARGA deslocamento: 0x000000 fileSize 0x0f830
.BRAÇO.exidx seção final addr: hex(0x00f2e8 + 0x00548) = 0xf830
02 CARGA de compensação:0x010000 tamanho do arquivo:0x00cf4
.init_array seção de começar endereço: 10000h
.bss seção final addr: hex(0x00f2e8 + 0 ) = 0x10cf4
Você vê o readelf
certamente imprima as seções em um segmento calcula.Eles combinam bem.