Forum: Mikrocontroller und Digitale Elektronik ELF File Offset für Sektionen


von D. F. (Firma: EDF) (derdan)


Lesenswert?

Hallo,
ich würde gerne ein Tool bauen, welches ein ELF File einlesen kann. 
Controler ist AVR32U3C3 und die GCC Toolchain von Atmel Studio 6.2 wird 
benutzt.

Mit dem tool arvr32-objdump -
C:\mingw\bin\objdump my.elf -h -p >dump.txt
1
SBS_Boot_Secondary_HW25.elf:     file format elf32-big
2
3
Program Header:
4
    LOAD off    0x00000400 vaddr 0x80000000 paddr 0x80000000 align 2**10
5
         filesz 0x00018980 memsz 0x00018980 flags rwx
6
    NULL off    0x00000000 vaddr 0x00000004 paddr 0x00000004 align 2**0
7
         filesz 0x00000000 memsz 0x00000004 flags rw-
8
    LOAD off    0x00019008 vaddr 0x00000008 paddr 0x80018328 align 2**10
9
         filesz 0x00000650 memsz 0x00000650 flags rw-
10
    NULL off    0x00000000 vaddr 0x00000658 paddr 0x00000658 align 2**2
11
         filesz 0x00000000 memsz 0x0000f9a8 flags rw-
12
    LOAD off    0x00019658 vaddr 0x00000000 paddr 0x00000000 align 2**10
13
         filesz 0x00000000 memsz 0x00000000 flags ---
14
    NULL off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
15
         filesz 0x00000000 memsz 0x00000000 flags ---
16
    LOAD off    0x00019658 vaddr 0x00000000 paddr 0x00000000 align 2**10
17
         filesz 0x00000000 memsz 0x00000000 flags ---
18
19
Sections:
20
Idx Name          Size      VMA       LMA       File off  Algn
21
  0 .reset        00008400  80000000  80000000  00000400  2**9
22
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
23
  1 .rela.got     00000000  80008400  80008400  00008800  2**2
24
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
25
  2 .text         0000ff24  80008400  80008400  00008800  2**9
26
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
27
  3 .lalign       00000004  80018324  80018324  00018724  2**0
28
                  ALLOC
29
  4 .dalign       00000004  00000004  00000004  00000000  2**0
30
                  ALLOC
31
  5 .ctors        00000008  00000008  80018328  00019008  2**2
32
                  CONTENTS, ALLOC, LOAD, DATA
33
  6 .dtors        00000008  00000010  80018330  00019010  2**2
34
                  CONTENTS, ALLOC, LOAD, DATA
35
  7 .jcr          00000004  00000018  80018338  00019018  2**2
36
                  CONTENTS, ALLOC, LOAD, DATA
37
  8 .got          0000000c  0000001c  8001833c  0001901c  2**2
38
                  CONTENTS, ALLOC, LOAD, DATA
39
  9 .data         00000630  00000028  80018348  00019028  2**2
40
                  CONTENTS, ALLOC, LOAD, DATA
41
 10 .bss          00001048  00000658  00000658  00000000  2**2
42
                  ALLOC
43
 11 .heap         0000d960  000016a0  000016a0  00000000  2**0
44
                  ALLOC
45
 12 .comment      00000030  00000000  00000000  00019658  2**0
46
                  CONTENTS, READONLY
47
 13 .debug_aranges 00001a08  00000000  00000000  00019688  2**0
48
                  CONTENTS, READONLY, DEBUGGING
49
 14 .debug_pubnames 0000380f  00000000  00000000  0001b090  2**0
50
                  CONTENTS, READONLY, DEBUGGING
51
 15 .debug_info   00035c10  00000000  00000000  0001e89f  2**0
52
                  CONTENTS, READONLY, DEBUGGING
53
 16 .debug_abbrev 000079e7  00000000  00000000  000544af  2**0
54
                  CONTENTS, READONLY, DEBUGGING
55
 17 .debug_line   0001dd3c  00000000  00000000  0005be96  2**0
56
                  CONTENTS, READONLY, DEBUGGING
57
 18 .debug_frame  00004adc  00000000  00000000  00079bd4  2**2
58
                  CONTENTS, READONLY, DEBUGGING
59
 19 .debug_str    00008889  00000000  00000000  0007e6b0  2**0
60
                  CONTENTS, READONLY, DEBUGGING
61
 20 .debug_loc    0000d300  00000000  00000000  00086f39  2**0
62
                  CONTENTS, READONLY, DEBUGGING
63
 21 .debug_macinfo 024bf56b  00000000  00000000  00094239  2**0
64
                  CONTENTS, READONLY, DEBUGGING
65
 22 .stack        00001000  0000f000  0000f000  00000000  2**0
66
                  ALLOC
67
 23 .checksum     00000008  80018978  80018978  00018d78  2**0
68
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
69
 24 .debug_ranges 00001a08  00000000  00000000  025537a4  2**0
70
                  CONTENTS, READONLY, DEBUGGING
Mit meinem Versuch mit der ELFIO Biliothek http://elfio.sourceforge.net/ 
kommt folgende Ausgabe.
Die Unterschiede sind in der Sektion „.ctors“ dort ist die Adresse bei 
objdump bei 0x80018328 (das stimmt auch mit dem Heximage überein) bei 
ELFIO bei 0x000000008, was wohl nur ein Offset auf eine andere Adresse 
ist. Nun die Frage, wie bestimme ich diesen unbekannten Offset. Bzw. 
wie macht das Objdump von GCC das?
1
ELF Header
2
3
  Class:      ELF32
4
  Encoding:   Big endian
5
  ELFVersion: Current
6
  Type:       Executable file
7
  Machine:    Atmel Corporation 32-bit microprocessor family
8
  Version:    Current
9
  Entry:      0x80000000
10
  Flags:      0x0
11
12
Section Headers:
13
[  Nr ] Type              Addr     Size     ES Flg Lk Inf Al Name
14
[    0] NULL              00000000 00000000 00     00 000  0
15
[    1] PROGBITS          80000000 00008400 00 AX  00 000 10 .reset
16
[    2] RELA              80008400 00000000 0c A   00 009  3 .rela.got
17
[    3] PROGBITS          80008400 0000ff24 00 AX  00 000 10 .text
18
[    4] NOBITS            80018324 00000004 00 WA  00 000  1 .lalign
19
[    5] NOBITS            00000004 00000004 00 WA  00 000  1 .dalign
20
[    6] PROGBITS          00000008 00000008 00 WA  00 000  3 .ctors
21
[    7] PROGBITS          00000010 00000008 00 WA  00 000  3 .dtors
22
[    8] PROGBITS          00000018 00000004 00 WA  00 000  3 .jcr
23
[    9] PROGBITS          0000001c 0000000c 04 WA  00 000  3 .got
24
[   10] PROGBITS          00000028 00000630 00 WA  00 000  3 .data
25
[   11] NOBITS            00000658 00001048 00 WA  00 000  3 .bss
26
[   12] NOBITS            000016a0 0000d960 00 WA  00 000  1 .heap
27
[   13] PROGBITS          00000000 00000030 01     00 000  1 .comment
28
[   14] PROGBITS          00000000 00001a08 00     00 000  1 .debug_aranges
29
[   15] PROGBITS          00000000 0000380f 00     00 000  1 .debug_pubnames
30
[   16] PROGBITS          00000000 00035c10 00     00 000  1 .debug_info
31
[   17] PROGBITS          00000000 000079e7 00     00 000  1 .debug_abbrev
32
[   18] PROGBITS          00000000 0001dd3c 00     00 000  1 .debug_line
33
[   19] PROGBITS          00000000 00004adc 00     00 000  3 .debug_frame
34
[   20] PROGBITS          00000000 00008889 01     00 000  1 .debug_str
35
[   21] PROGBITS          00000000 0000d300 00     00 000  1 .debug_loc
36
[   22] PROGBITS          00000000 024bf56b 00     00 000  1 .debug_macinfo
37
[   23] NOBITS            0000f000 00001000 00 WA  00 000  1 .stack
38
[   24] PROGBITS          80018978 00000008 00 AX  00 000  1 .checksum
39
[   25] PROGBITS          00000000 00001a08 00     00 000  1 .debug_ranges
40
[   26] STRTAB            00000000 00000105 00     00 000  1 .shstrtab
41
[   27] SYMTAB            00000000 00002960 10     1c 141  3 .symtab
42
[   28] STRTAB            00000000 000028f9 00     00 000  1 .strtab
43
Key to Flags: W (write), A (alloc), X (execute)

von Volle (Gast)


Lesenswert?

Hab ich schon gemacht

Da du keine Frage hast musst du es einfach nur machen.


Ach ja,  das Format lässt einige Freiräume die von Compilern und Linkern 
recht unterschiedlich ausgenutzt werden

von D. F. (Firma: EDF) (derdan)


Lesenswert?

Na die Frage ist doch, wie dieser Offset auszurechnen ist.

von Volle (Gast)


Lesenswert?

Beide Tools liefern nicht den Inhalt des ELF Files 1:1

es werden zum Teil schon Berechnungen durchgeführt
objdump ist sehr gut
elfio kenne ich nicht



Intern arbeiten das Elf mit vielen Tabellen  die über den File ofset 
miteienander verbunden sind

So sind Namen sind zB. einer eigen String Liste und es wird mit einem 
Ofset auf den Begin des Strings  gezeigt

von D. F. (Firma: EDF) (derdan)


Lesenswert?

Vielen Dank für die Information.
Aber wie rechnet man den nun diesen Offset aus?

von Volle (Gast)


Lesenswert?

Wenn ich es noch recht weiss bezieht sich der Fileoffset auf den Index 
der jeweiligen Tabelle. Deren Beginn steht in einer anderen Tabelle

Da must du aber direkt in der Formatbeschreibung nachschauen

die Tools liefern ja schon einer Auswertung und nicht Orginalteile des 
Files


aber der objdump  und readelf mir ihren vielen Optionen liefern recht 
viel  in vielen möglichen Formatierungen

http://www.cs.princeton.edu/courses/archive/spr08/cos217/reading/elf.pdf

https://en.wikipedia.org/wiki/Executable_and_Linkable_Format


ich habe es mit perl und java gelesen
besser geht es aber mit c++

Um  file lokale Sprungziele aufzulösen kann man auch die *.o file 
auszuwerten.
Selbes Format  andere Sections und relativ adressiert

Mühsam sind die DWARF Debug Infos

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.