2016-10-09 50 views
7

Piszę kompilator i dopiero zaczynam generować pliki wykonywalne ELF od zera. Tworzę sekcję .text (chociaż nie ma ona nazwy, ponieważ nie tworzę jeszcze tablicy string) i próbuję umieścić ją w segmencie PT_LOAD. Jednak readelf nie zgłasza, że ​​sekcja jest przypisana do segmentu, a objdump odmawia zdemontowania kodu w sekcji .text. Jest to odczyt readelf, z niektórych bitów pominięte dla zwięzłości:Sekcje ELF nieprzypisane do segmentów zgodnie z oczekiwaniami

ELF Header: 
    Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF64 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        EXEC (Executable file) 
    Machine:       Advanced Micro Devices X86-64 
    Version:       0x1 
    Entry point address:    0x0 
    Start of program headers:   64 (bytes into file) 
    Start of section headers:   122 (bytes into file) 
    Flags:        0x0 
    Size of this header:    64 (bytes) 
    Size of program headers:   56 (bytes) 
    Number of program headers:   1 
    Size of section headers:   64 (bytes) 
    Number of section headers:   2 
    Section header string table index: 0 

Section Headers: 
    [Nr] Name    Type    Address   Offset 
     Size    EntSize   Flags Link Info Align 
    [ 0] <no-name>   NULL    0000000000000000 00000000 
     0000000000000000 0000000000000000   0  0  0 
    [ 1] <no-name>   PROGBITS   0000000008048000 00000078 
     0000000000000002 0000000000000000 AX  0  0  16 
Key to Flags: 
    W (write), A (alloc), X (execute), M (merge), S (strings), l (large) 
    I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) 
    O (extra OS processing required) o (OS specific), p (processor specific) 

There are no section groups in this file. 

Program Headers: 
    Type   Offset    VirtAddr   PhysAddr 
       FileSiz   MemSiz    Flags Align 
    LOAD   0x0000000000000078 0x0000000008048000 0x0000000008048000 
       0x0000000000000002 0x0000000000000002 R E 1000 

Na domiar 0x78, jestem po prostu emitując dwa push ebx s (OPCODE 0x53) do testów. Oto zrzut hex:

00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 
00000010 02 00 3e 00 01 00 00 00 00 00 00 00 00 00 00 00 |..>.............| 
00000020 40 00 00 00 00 00 00 00 7a 00 00 00 00 00 00 00 |@.......z.......| 
00000030 00 00 00 00 40 00 38 00 01 00 40 00 02 00 00 00 |[email protected]@.....| 
00000040 01 00 00 00 05 00 00 00 78 00 00 00 00 00 00 00 |........x.......| 
00000050 00 80 04 08 00 00 00 00 00 80 04 08 00 00 00 00 |................| 
00000060 02 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 |................| 
00000070 00 10 00 00 00 00 00 00 53 53 00 00 00 00 00 00 |........SS......| 
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
* 
000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 |................| 
000000c0 00 00 06 00 00 00 00 00 00 00 00 80 04 08 00 00 |................| 
000000d0 00 00 78 00 00 00 00 00 00 00 02 00 00 00 00 00 |..x.............| 
000000e0 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 |................| 
* 
000000fa 

Edit: Pytanie - Dlaczego nie jest to odcinek do mapowania segmentu pokazano między nimi, i dlaczego nie jest demontaż pokazano objdump?

+0

Masz pytanie? Podajesz fakty, a potem ...? Jeśli twoje pytanie brzmi "dlaczego nie czyta odcinka do mapowania segmentów, odpowiedź prawdopodobnie będzie: nie twórz sekcji bez nazwy". –

+0

@EmployedRussian - dodano pytanie. A zatem tablica napisów z nazwami sekcji jest wymagana do demontażu przy użyciu "objdump" i pokazywania odwzorowań? Spróbuję dodać tabelę strun, kiedy wrócę do domu i zobaczę, czy to robi różnicę, dzięki! –

+0

@EmployedRussian yup - wydaje się, że tablica napisów jest potrzebna do raportowania mapowań z jakiegoś powodu. Jeśli chcesz opublikować to jako odpowiedź, zaakceptuję to. –

Odpowiedz

1

Dlaczego nie jest to odcinek do mapowania segmentu pokazano między dwoma

Ponieważ nie ma ważne odcinki (o ile readelf można powiedzieć).

i dlaczego nie pokazano żadnego demontażu za pomocą programu objdump?

objdump wykorzystuje również sekcje.

Mimo że sekcje nie są wymagane dla części życia wykonywalna, wiele narzędzi zależy od sekcji. Na przykład pojedynczy segment w pliku wykonywalnym zawiera kod i nagłówek ELF oraz nagłówek programu. Ogólnie rzecz biorąc, nie musisz , aby rozebrać nagłówek. Bez sekcji objdump nie wie, od czego rozpocząć demontaż.

+2

Aby rozwinąć, aby sekcja była poprawna, pole 'name' musi wskazywać na niezerowy wpis w poprawnej tabeli napisów. –