blob: 81ee74e284b079aeb20101b6c4b3e9d6e8e5c2e3 (
plain)
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
74
75
76
77
|
open import Basic_classes
open import Bool
open import Num
open import String
open import Elf_types
open import Bitstring
open import Missing_pervasives
open import Show
type elf32_interpreted_segment =
<| elf32_segment_body : bitstring (** Body of the segment *)
; elf32_segment_type : nat (** Type of the segment *)
; elf32_segment_size : nat (** Size of the segment in bytes *)
; elf32_segment_memsz : nat (** Size of the segment in memory in bytes *)
; elf32_segment_base : nat (** Base address of the segment *)
; elf32_segment_flags : (bool * bool * bool) (** READ, WRITE, EXECUTE flags. *)
|>
type elf64_interpreted_segment =
<| elf64_segment_body : bitstring (** Body of the segment *)
; elf64_segment_type : nat (** Type of the segment *)
; elf64_segment_size : nat (** Size of the segment in bytes *)
; elf64_segment_memsz : nat (** Size of the segment in memory in bytes *)
; elf64_segment_base : nat (** Base address of the segment *)
; elf64_segment_flags : (bool * bool * bool) (** READ, WRITE, EXECUTE flags. *)
|>
val elf32_interpret_program_header_flags : elf32_word -> (bool * bool * bool)
let elf32_interpret_program_header_flags flags =
let zero = elf32_word_of_int32 0 in
let one = elf32_word_of_int32 1 in
let two = elf32_word_of_int32 2 in
let four = elf32_word_of_int32 4 in
(not (elf32_word_land flags one = zero),
not (elf32_word_land flags two = zero),
not (elf32_word_land flags four = zero))
val elf64_interpret_program_header_flags : elf64_word -> (bool * bool * bool)
let elf64_interpret_program_header_flags flags =
let zero = elf64_word_of_int32 0 in
let one = elf64_word_of_int32 1 in
let two = elf64_word_of_int32 2 in
let four = elf64_word_of_int32 4 in
(not (elf64_word_land flags one = zero),
not (elf64_word_land flags two = zero),
not (elf64_word_land flags four = zero))
val string_of_flags : (bool * bool * bool) -> string
let string_of_flags flags =
match flags with
| (read, write, execute) ->
bracket [show read; show write; show execute]
end
val string_of_elf32_interpreted_segment : elf32_interpreted_segment -> string
let string_of_elf32_interpreted_segment seg =
unlines [
"Body of length: " ^ show (Bitstring.length seg.elf32_segment_body)
; "Segment type: " ^ show seg.elf32_segment_type
; "Segment size: " ^ show seg.elf32_segment_size
; "Segment memory size: " ^ show seg.elf32_segment_memsz
; "Segment base address: " ^ show seg.elf32_segment_base
; "Segment flags: " ^ string_of_flags seg.elf32_segment_flags
]
val string_of_elf64_interpreted_segment : elf64_interpreted_segment -> string
let string_of_elf64_interpreted_segment seg =
unlines [
"Body of length: " ^ show (Bitstring.length seg.elf64_segment_body)
; "Segment type: " ^ show seg.elf64_segment_type
; "Segment size: " ^ show seg.elf64_segment_size
; "Segment memory size: " ^ show seg.elf64_segment_memsz
; "Segment base address: " ^ show seg.elf64_segment_base
; "Segment flags: " ^ string_of_flags seg.elf64_segment_flags
]
|