summaryrefslogtreecommitdiff
path: root/src/elf_model/elf_file1.lem
blob: ff2bba61afb69d22f7b02978d0259a0d5ca50f15 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
open import Basic_classes
open import String

open import Endianness

open import Elf_header
open import Elf_types

open import Bitstring
open import Error
open import Missing_pervasives
open import Show

(** Type [elf32_file1] represents the first lazy unfolding of the structure
  * of an ELF file, wherein the ELF header is populated and all other data
  * is left uninterpreted.
  *)
type elf32_file1 =
  <| elf32_file1_header : elf32_header (** The ELF header (mandatory) *)
   ; elf32_file1_body   : bitstring    (** Uninterpreted data *)
   |>

class (HasElf32File1 'a)
  val get_elf32_file1 : 'a -> elf32_file1
end

instance (HasElf32File1 elf32_file1)
  let get_elf32_file1 f1 = f1
end

instance (HasElf32Header elf32_file1)
  let get_elf32_header file1 = file1.elf32_file1_header
end

(** Type [elf64_file1] represents the first lazy unfolding of the structure
  * of an ELF file, wherein the ELF header is populated and all other data
  * is left uninterpreted.
  *)
type elf64_file1 =
  <| elf64_file1_header : elf64_header (** The ELF header (mandatory) *)
   ; elf64_file1_body   : bitstring    (** Uninterpreted data *)
   |>

class (HasElf64File1 'a)
  val get_elf64_file1 : 'a -> elf64_file1
end

instance (HasElf64File1 elf64_file1)
  let get_elf64_file1 f1 = f1
end

instance (HasElf64Header elf64_file1)
  let get_elf64_header file1 = file1.elf64_file1_header
end

val string_of_elf32_file1 : hdr_print_bundle -> elf32_file1 -> string
let string_of_elf32_file1 hdr_bdl f1 =
  unlines [
    "\n*Type elf32_file1:"
  ; "**Header:"
  ; string_of_elf32_header hdr_bdl f1.elf32_file1_header
  ; "Body:"
  ; "\tUninterpreted data of length " ^ show (Bitstring.length f1.elf32_file1_body)
  ]

val string_of_elf64_file1 : hdr_print_bundle -> elf64_file1 -> string
let string_of_elf64_file1 hdr_bdl f1 =
  unlines [
    "\n*Type elf64_file1:"
  ; "**Header:"
  ; string_of_elf64_header hdr_bdl f1.elf64_file1_header
  ; "Body:"
  ; "\tUninterpreted data of length " ^ show (Bitstring.length f1.elf64_file1_body)
  ]

(** [is_executable_efl32_file1] tests whether the ELF file is an executable
  * file type.
  *)
val is_executable_elf32_file1 : elf32_file1 -> bool
let is_executable_elf32_file1 f1 =
  nat_of_elf32_half f1.elf32_file1_header.elf32_type = elf_ft_exec

(** [is_executable_efl64_file1] tests whether the ELF file is an executable
  * file type.
  *)
val is_executable_elf64_file1 : elf64_file1 -> bool
let is_executable_elf64_file1 f1 =
  nat_of_elf64_half f1.elf64_file1_header.elf64_type = elf_ft_exec

(** [is_shared_object_elf32_file1] tests whether the ELF file is a shared object
  * file type.
  *)
val is_shared_object_elf32_file1 : elf32_file1 -> bool
let is_shared_object_elf32_file1 f1 =
  nat_of_elf32_half f1.elf32_file1_header.elf32_type = elf_ft_dyn

(** [is_shared_object_elf64_file1] tests whether the ELF file is a shared object
* file type.
*)
val is_shared_object_elf64_file1 : elf64_file1 -> bool
let is_shared_object_elf64_file1 f1 =
  nat_of_elf64_half f1.elf64_file1_header.elf64_type = elf_ft_dyn

(** [read_elf32_file1 bs] lazily unfolds [bs] revealing the ELF file's header,
  * leaving all other data uninterpreted.
  *)
val read_elf32_file1 : bitstring -> error elf32_file1
let read_elf32_file1 bs0 =
  read_elf32_header bs0 >>= fun (hdr, bs1) ->
  return <| elf32_file1_header = hdr; elf32_file1_body = bs0 |>

(** [read_elf64_file1 bs] lazily unfolds [bs] revealing the ELF file's header,
  * leaving all other data uninterpreted.
  *)
val read_elf64_file1 : bitstring -> error elf64_file1
let read_elf64_file1 bs0 =
  read_elf64_header bs0 >>= fun (hdr, bs1) ->
  return <| elf64_file1_header = hdr; elf64_file1_body = bs0 |>