Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Program Image uit een ELF bestand

Pagina: 1
Acties:
  • 306 views sinds 30-01-2008
  • Reageer

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 24-10 20:19
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:
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?

Verwijderd

Gehakt schreef op donderdag 20 december 2007 @ 22:55:
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?
In de bss sectie staan alle ongeinitialiseerde variabelen en arrays. Juist omdat ze nog niet geinitialiseerd zijn nemen ze ook geen ruimte in het bestand zelf. Je moet inderdaag gewoon een stuk geheugen (in jouw geval blijkbaar beginnend op adres 0x11F4C) op 0 instellen. De grootte is ook wel uit de header te halen. De rest van je vragen kan ik helaas ook niet beantwoorden.

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 24-10 20:19
Ja maar hoe weet ik dan dat ik de .bss sectie mee moet nemen?
Iemand nog antwoord op mijn andere vragen?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Ik snap eerlijk gezegd je vraag niet, "waarom moet ik de .bss sectie meenemen"? Omdat die in de section header lijst staat, en nodig is voor programma's?

.eh_frame en .gcc_except_table lijken met relevant voor C++ exceptionhandling. Zolang een programma geen exceptie throwt zijn die sceties niet nodig, daarom laad je ze niet initieel. Bij een exception wordt .eh_frame gebruikt om de stackframes te interpreteren, en .gcc_except_table is vermoedelijk om actieve variabelen in de stack frames te vinde op basis van de IP waar de excepie vandaan komt.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein