root/trunk/kong/examples/elf_dump.d

Revision 15, 3.1 kB (checked in by ilm, 4 years ago)

- Non-native endian support for ELF
- 32/64bit ELF files are interfaced through proxy data types instead of templates now.
- Removed x86 dissasembler and replaced it with an instruction length parser.
- Wrapped standard library to enable Tango and Phobos support.

Line 
1 /*
2   6        _._    (     _/
3     6    c(@@ )o __)   _/  _/      _/_/    _/_/_/      _/_/_/
4   6     __('_  (      _/_/      _/    _/  _/    _/  _/    _/
5        q  /. )_)     _/  _/    _/    _/  _/    _/  _/    _/
6          /( (       _/    _/    _/_/    _/    _/    _/_/_/
7  2007    m  m                                          _/
8  public domain : N. Alexander <wqeqweuqy@hotmail> _/_/
9
10  example: extending default ELF miner's behavior.
11 */
12
13 /* depends:
14  * internal/core_stream.d
15  * internal/image_interface.d
16  * ELF/ELF.d
17  * ELF/types.d
18  */
19
20
21 import kong.ELF.ELF;
22 import kong.internal.stdlib;
23
24
25
26 class _PT : PT
27 {
28     this(image img)
29     {  .print!("%s")("PT_CONSTRUCTOR");
30         super(img, new _DT(this, img));
31         table[PT_LOAD] = &xPT_LOAD;
32     }
33
34     void xPT_LOAD(inout Phdr p)
35     {
36         .print!("PT_LOAD: %08x - %08x (%d bytes) | file @ %08x (%d bytes)")
37         (p[p.p_vaddr], (p[p.p_vaddr] + p[p.p_memsz]), p[p.p_memsz], p[p.p_offset], p[p.p_filesz]);
38     }
39 }
40
41 class _DT : DT
42 {
43     this(_PT pt, image img){ super(pt, img); }
44
45     void finalize()
46     {
47         super.finalize();
48
49         if (symbols)
50         {
51             .print!("\n\nSYMBOLS (%d):\n\n %-40s  %-8s  TYPE  BIND  SIZE ")(symbols.length, "SYMBOL NAME", "VALUE");
52
53             foreach (ref Sym symbol; symbols)
54                 .print!(" %-40.40s  %08x   %02d    %02d   %04x ")
55                 (
56                     string_lookup(symbol[Sym.st_name]),
57                     symbol[Sym.st_value], ST_TYPE(symbol), ST_BIND(symbol),
58                     symbol[Sym.st_size]
59                 );
60         }
61
62         if (reloc)
63         {
64             .print!("\n\nRELOCATIONS (%d):\n\n %-40s  OFFSET    TYPE ")
65                 (reloc.length, "SYMBOL NAME");
66
67             foreach (ref Rel r; reloc)
68                 .print!(" %-40.40s  %08x   %02d")
69                 (
70                     string_lookup(
71                     symbols[R_SYM(r)][Sym.st_name]),
72                     r[r.r_offset],
73                     R_TYPE(r)
74                 );
75         }
76
77         if (reloc_a)
78         {
79             .print!("\n\nRELOCATIONS (%d) [addends]:\n\n %-40s  OFFSET    TYPE  ADDEND")
80                 (reloc_a.length, "SYMBOL NAME");
81
82             foreach (ref Rela r; reloc_a)
83                 .print!(" %-40.40s  %08x   %02d   %08x")
84                 (
85                     string_lookup(symbols[R_SYM(r)][Sym.st_name]),
86                     r[r.r_offset], R_TYPE(r),
87                     r[r.r_addend]
88                 );
89
90         }
91
92         .print!("%s")("\n\nIMPORTS:\n");
93
94         foreach (index; depends)
95             .print!("> %s")(string_lookup(index));
96
97     }
98 }
99
100 class _SHT : SHT
101 {
102     this(image img){ .print!("%s")("SHT_CONSTRUCTOR"); super(img); }
103
104     void finalize()
105     {
106         super.finalize();
107
108         .print!("%s")("\n\nSECTIONS:\n");
109
110         foreach (name, index; sections)
111             .print!("%s")(name);
112     }
113
114 }
115
116
117
118 void
119 main(string argv[])
120 {
121     if (argv.length != 2)
122     {
123         .print!("%s")("usage: elf_dump <target>");
124         return;
125     }
126     image i = new image(argv[1], IO_MODE.R);
127        
128     _PT  p = new _PT(i);
129     _SHT s = new _SHT(i);
130
131     i.analyze(p, s);
132 }
Note: See TracBrowser for help on using the browser.