Liste aller Variablen aus ELF-Datei

OP #7386229
Lesenswert?

Hallo zusammen,

gibt es ein Tool das basierend aus einer ELF-Datei mit Debug-Info eine Liste aller Variablen (globale Variablen und Klassenvariablen aller Objekte) erstellt inklusive Adresse und Datentyp?

Also ungefähr in folgedem Format:

1
GlobalVariableName  Address  DataType
2
ObjectName.ClassVariableName  Address  DataType
(Firma: Schweigstill IT) Persönliche Seite #7386668
Lesenswert?

Sebastian W. schrieb:

Geht das nicht mit objdump?

Ja, das funktioniert ganz ausgezeichnet, und zwar schon seit wirklich zig Jahren. Aber wahrscheinlich ist der TE einfach zu faul oder zu ignorant, sich mit solchen Standardwerkzeugen zu beschäftigen. Oder das ganze soll schön klicki-bunti-mäßig sein, am besten noch als Webservice oder Smartphone-App, damit es nicht nur lokale Ressourcen nutzt, sondern alles ins Netz hinausposaunt.

OP #7386700
Lesenswert?

Vielen Dank Dirk und Sebastian für die Antworten!

Über objdump und readelf bin ich auch schon gestolpert, aber wenn ich es richtig sehe, ist es nur die Hälfte der Lösung. Ich müsste den Output (in meinem Fall Dwarf v4) noch parsen um an das gewünschte Ergebnis zu kommen. Um das Rad nicht jedes Mal neu zu erfinden hatte ich eben gedacht zu fragen ob es da schon etas gibt.

Zum Beispiel bräuchte ich folgende Infos aus der Dwarf Info:

1
 <1><b3540>: Abbrev Number: 13 (DW_TAG_variable)
2
    <b3541>   DW_AT_name        : (indirect string, offset: 0x2f0a0): SystemCoreClock
3
    <b3545>   DW_AT_decl_file   : 4
4
    <b3546>   DW_AT_decl_line   : 58
5
    <b3547>   DW_AT_decl_column : 17
6
    <b3548>   DW_AT_type        : <0xb3379>
7
    <b354c>   DW_AT_external    : 1
8
    <b354c>   DW_AT_declaration : 1
9

10
 <1><b37d5>: Abbrev Number: 14 (DW_TAG_variable)
11
    <b37d6>   DW_AT_specification: <0xb3540>
12
    <b37da>   DW_AT_decl_file   : 6
13
    <b37db>   DW_AT_decl_line   : 135
14
    <b37dc>   DW_AT_decl_column : 12
15

16
 <1><14cfe>: Abbrev Number: 30 (DW_TAG_variable)
17
    <14cff>   DW_AT_abstract_origin: <0xb37d5>
18
    <14d03>   DW_AT_location    : 5 byte block: 3 0 0 0 20   (DW_OP_addr: 20000000)
19
  
20
 <1><b3379>: Abbrev Number: 3 (DW_TAG_typedef)
21
    <b337a>   DW_AT_name        : (indirect string, offset: 0x3e2c): uint32_t
22
    <b337e>   DW_AT_decl_file   : 2
23
    <b337f>   DW_AT_decl_line   : 48
24
    <b3380>   DW_AT_decl_column : 20
25
    <b3381>   DW_AT_type        : <0xb3334>
26
  
27
 <1><b3334>: Abbrev Number: 3 (DW_TAG_typedef)
28
    <b3335>   DW_AT_name        : (indirect string, offset: 0x3e2a): __uint32_t
29
    <b3339>   DW_AT_decl_file   : 1
30
    <b333a>   DW_AT_decl_line   : 79
31
    <b333b>   DW_AT_decl_column : 25
32
    <b333c>   DW_AT_type        : <0xb3340>
33
  
34
 <1><b3340>: Abbrev Number: 2 (DW_TAG_base_type)
35
    <b3341>   DW_AT_byte_size   : 4
36
    <b3342>   DW_AT_encoding    : 7  (unsigned)
37
    <b3343>   DW_AT_name        : (indirect string, offset: 0x363ec): long unsigned int

Um damit die gewünschten Informationen für eine globale Variable zu bekommen:

1
SystemCoreClock 0x20000000 long unsigned int

Noch komplizierter wird es dann bei Klassenvariablen...

Kennt ihr hierfür einen zuverlässigen Parser? (Ich habe hierfür wenig brauchbare Ansätze gefunden)

#7386712
Lesenswert?

Als Posaune hätte ich bei Cpp, cpp check, depend und pattern, wenn's denn cpp wäre. Die Hyphe will ich jetzt nicht erwähnen.

ELF ... ? so reverse ?

Parser, geht ja auch, wenn man einen hat. Üblich sind eher Filter mit grep, awk und sed, als gebräuchliche Werkzeuge. Die Thematik, hier, wurde in mehreren Stackoverflow Beiträgen schon abgehandelt.

Sorry für die Posaune.

stackoverflow ! re ad able composed attention -print

und noch einen schönen Tag

Dirk St

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren