summaryrefslogtreecommitdiff
path: root/src/elf_model/elf_interpreted_segment.lem
diff options
context:
space:
mode:
Diffstat (limited to 'src/elf_model/elf_interpreted_segment.lem')
-rw-r--r--src/elf_model/elf_interpreted_segment.lem77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/elf_model/elf_interpreted_segment.lem b/src/elf_model/elf_interpreted_segment.lem
new file mode 100644
index 00000000..81ee74e2
--- /dev/null
+++ b/src/elf_model/elf_interpreted_segment.lem
@@ -0,0 +1,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
+ ]