Sommige mensen weten ondertussen al dat ik mij een tijdje bezig hou met het uitpluizen van ELF bestanden.
Nu is mij dat ook grotendeels gelukt alleen ik loop tegen een probleem waar ik echt niets over kan vinden op het internet.
Allereerst hier de output van readelf in mijn ARM toolchain die ik op een ELF bestand uit een eerder project heb gebruikt:
In mijn bestand bevind zich 1 program header.
Hiermee kan ik een program image maken.
Maar als ik kijk naar de sections die geladen moeten worden volgens readelf, dan zijn dat de volgende: startup .text .rodata .data .bss
Echter als ik kijk naar het beginpunt volgens mijn programheader (0x008000) en de filesize (0x09f4c) dan zou de laatste byte 0x11F4C moeten zijn.
Alleen ik snap niet helemaal waarom .bss pas op adress 0x11F4C begint.
Ik weet dat dit eigenlijk gewoon een stukje geheugen is wat op 0 gezet moet worden.
Maar hoe moet ik dit precies behandelen?
En wat doen de sections .vectors, .eh_frame en .gcc_except_table.
Verder vraag ik mij af of mijn idee klopt om gewoon de stroom aan bytes beginnen te lezen vanaf adres 0x008000 tot en met 0x11F4C en dit in het arm geheugen te schrijven vanaf adres 0x40000000?
Of is er een beter manier om uit de programheader te halen welke secties er geladen moeten worden en deze individueel in het geheugen te gaan schrijven?
Nu is mij dat ook grotendeels gelukt alleen ik loop tegen een probleem waar ik echt niets over kan vinden op het internet.
Allereerst hier de output van readelf in mijn ARM toolchain die ik op een ELF bestand uit een eerder project heb gebruikt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
| ELF Header:
Magic: 7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: ARM
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x4000003c
Start of program headers: 52 (bytes into file)
Start of section headers: 186112 (bytes into file)
Flags: 0x2, has entry point, GNU EABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 1
Size of section headers: 40 (bytes)
Number of section headers: 22
Section header string table index: 19
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] startup PROGBITS 40000000 008000 00003c 00 AX 0 0 4
[ 2] .text PROGBITS 4000003c 00803c 009ab8 00 AX 0 0 4
[ 3] .vectors PROGBITS 40009af4 011f4c 000000 00 W 0 0 1
[ 4] .rodata PROGBITS 40009af4 011af4 000428 00 A 0 0 4
[ 5] .eh_frame PROGBITS 40009f1c 011f4c 000000 00 W 0 0 1
[ 6] .gcc_except_table PROGBITS 40009f1c 011f4c 000000 00 W 0 0 1
[ 7] .data PROGBITS 40009f1c 011f1c 000030 00 WA 0 0 4
[ 8] .bss NOBITS 40009f4c 011f4c 001d0c 00 WA 0 0 4
[ 9] .comment PROGBITS 00000000 011f4c 00033c 00 0 0 1
[10] .debug_aranges PROGBITS 00000000 012288 000608 00 0 0 8
[11] .debug_pubnames PROGBITS 00000000 012890 0017ee 00 0 0 1
[12] .debug_info PROGBITS 00000000 01407e 00a0c2 00 0 0 1
[13] .debug_abbrev PROGBITS 00000000 01e140 0037a4 00 0 0 1
[14] .debug_line PROGBITS 00000000 0218e4 003065 00 0 0 1
[15] .debug_frame PROGBITS 00000000 02494c 001a04 00 0 0 4
[16] .debug_str PROGBITS 00000000 026350 001cac 01 MS 0 0 1
[17] .debug_loc PROGBITS 00000000 027ffc 005303 00 0 0 1
[18] .debug_ranges PROGBITS 00000000 02d2ff 000320 00 0 0 1
[19] .shstrtab STRTAB 00000000 02d61f 0000e0 00 0 0 1
[20] .symtab SYMTAB 00000000 02da70 002b50 10 21 388 4
[21] .strtab STRTAB 00000000 0305c0 001261 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), 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 Flg Align
LOAD 0x008000 0x40000000 0x40000000 0x09f4c 0x0bc58 RWE 0x8000
Section to Segment mapping:
Segment Sections...
00 startup .text .rodata .data .bss
There is no dynamic section in this file.
There are no relocations in this file.
There are no unwind sections in this file.
Symbol table '.symtab' contains 693 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 40000000 0 SECTION LOCAL DEFAULT 1
(.......................etc.......................)
No version information found in this file. |
In mijn bestand bevind zich 1 program header.
Hiermee kan ik een program image maken.
Maar als ik kijk naar de sections die geladen moeten worden volgens readelf, dan zijn dat de volgende: startup .text .rodata .data .bss
Echter als ik kijk naar het beginpunt volgens mijn programheader (0x008000) en de filesize (0x09f4c) dan zou de laatste byte 0x11F4C moeten zijn.
Alleen ik snap niet helemaal waarom .bss pas op adress 0x11F4C begint.
Ik weet dat dit eigenlijk gewoon een stukje geheugen is wat op 0 gezet moet worden.
Maar hoe moet ik dit precies behandelen?
En wat doen de sections .vectors, .eh_frame en .gcc_except_table.
Verder vraag ik mij af of mijn idee klopt om gewoon de stroom aan bytes beginnen te lezen vanaf adres 0x008000 tot en met 0x11F4C en dit in het arm geheugen te schrijven vanaf adres 0x40000000?
Of is er een beter manier om uit de programheader te halen welke secties er geladen moeten worden en deze individueel in het geheugen te gaan schrijven?