File Coverage

blib/lib/Data/ParseBinary/Executable/ELF32.pm
Criterion Covered Total %
statement 9 9 100.0
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 12 12 100.0


line stmt bran cond sub pod time code
1             package Data::ParseBinary::Executable::ELF32;
2 1     1   939 use strict;
  1         3  
  1         41  
3 1     1   6 use warnings;
  1         3  
  1         32  
4 1     1   5 use Data::ParseBinary;
  1         2  
  1         1111  
5            
6             #"""
7             #Executable and Linkable Format (ELF), 32 bit, little endian
8             #Used on *nix systems as a replacement of the older a.out format
9             #"""
10            
11             my $elf32_program_header = Struct("program_header",
12             Enum(ULInt32("type"),
13             NULL => 0,
14             LOAD => 1,
15             DYNAMIC => 2,
16             INTERP => 3,
17             NOTE => 4,
18             SHLIB => 5,
19             PHDR => 6,
20             _default_ => $DefaultPass,
21             ),
22             ULInt32("offset"),
23             ULInt32("vaddr"),
24             ULInt32("paddr"),
25             ULInt32("file_size"),
26             ULInt32("mem_size"),
27             ULInt32("flags"),
28             ULInt32("align"),
29             );
30            
31             my $elf32_section_header = Struct("section_header",
32             ULInt32("name_offset"),
33             Pointer(sub { $_->ctx(2)->{strtab_data_offset} + $_->ctx->{name_offset} },
34             CString("name")
35             ),
36             Enum(ULInt32("type"),
37             NULL => 0,
38             PROGBITS => 1,
39             SYMTAB => 2,
40             STRTAB => 3,
41             RELA => 4,
42             HASH => 5,
43             DYNAMIC => 6,
44             NOTE => 7,
45             NOBITS => 8,
46             REL => 9,
47             SHLIB => 10,
48             DYNSYM => 11,
49             _default_ => $DefaultPass,
50             ),
51             ULInt32("flags"),
52             ULInt32("addr"),
53             ULInt32("offset"),
54             ULInt32("size"),
55             ULInt32("link"),
56             ULInt32("info"),
57             ULInt32("align"),
58             ULInt32("entry_size"),
59             Pointer(sub { $_->ctx->{offset} },
60             Field("data", sub { $_->ctx->{size} })
61             ),
62             );
63            
64             our $elf32_parser = Struct("elf32_file",
65             Struct("identifier",
66             Const(Bytes("magic", 4), "\x7fELF"),
67             Enum(Byte("file_class"),
68             NONE => 0,
69             CLASS32 => 1,
70             CLASS64 => 2,
71             ),
72             Enum(Byte("encoding"),
73             NONE => 0,
74             LSB => 1,
75             MSB => 2,
76             ),
77             Byte("version"),
78             Padding(9),
79             ),
80             Enum(ULInt16("type"),
81             NONE => 0,
82             RELOCATABLE => 1,
83             EXECUTABLE => 2,
84             SHARED => 3,
85             CORE => 4,
86             ),
87             Enum(ULInt16("machine"),
88             NONE => 0,
89             M32 => 1,
90             SPARC => 2,
91             I386 => 3,
92             Motorolla68K => 4,
93             Motorolla88K => 5,
94             Intel860 => 7,
95             MIPS => 8,
96             ),
97             ULInt32("version"),
98             ULInt32("entry"),
99             ULInt32("ph_offset"),
100             ULInt32("sh_offset"),
101             ULInt32("flags"),
102             ULInt16("header_size"),
103             ULInt16("ph_entry_size"),
104             ULInt16("ph_count"),
105             ULInt16("sh_entry_size"),
106             ULInt16("sh_count"),
107             ULInt16("strtab_section_index"),
108            
109             # calculate the string table data offset (pointer arithmetics)
110             # ugh... anyway, we need it in order to read the section names, later on
111             Pointer(sub { $_->ctx->{sh_offset} + $_->ctx->{strtab_section_index} * $_->ctx->{sh_entry_size} + 16 },
112             ULInt32("strtab_data_offset"),
113             ),
114            
115             # program header table
116             Pointer(sub { $_->ctx->{ph_offset} },
117             Array(sub { $_->ctx->{ph_count} },
118             $elf32_program_header
119             )
120             ),
121            
122             # section table
123             Pointer(sub { $_->ctx->{sh_offset} },
124             Array(sub { $_->ctx->{sh_count} },
125             $elf32_section_header
126             )
127             ),
128             );
129            
130             require Exporter;
131             our @ISA = qw(Exporter);
132             our @EXPORT = qw($elf32_parser);
133            
134            
135             1;
136            
137             __END__