summaryrefslogtreecommitdiff
path: root/lib/ocaml_rts/linksem/adaptors/harness_interface.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ocaml_rts/linksem/adaptors/harness_interface.ml')
-rw-r--r--lib/ocaml_rts/linksem/adaptors/harness_interface.ml1154
1 files changed, 1154 insertions, 0 deletions
diff --git a/lib/ocaml_rts/linksem/adaptors/harness_interface.ml b/lib/ocaml_rts/linksem/adaptors/harness_interface.ml
new file mode 100644
index 00000000..8ce4f6bd
--- /dev/null
+++ b/lib/ocaml_rts/linksem/adaptors/harness_interface.ml
@@ -0,0 +1,1154 @@
+(*Generated by Lem from adaptors/harness_interface.lem.*)
+open Lem_basic_classes
+open Lem_bool
+open Lem_function
+open Lem_maybe
+open Lem_num
+open Lem_string
+
+open Byte_sequence
+open Error
+open Hex_printing
+open Missing_pervasives
+open Show
+
+open Default_printing
+
+open Endianness
+open String_table
+
+open Elf_dynamic
+open Elf_file
+open Elf_header
+open Elf_program_header_table
+open Elf_relocation
+open Elf_section_header_table
+open Elf_symbol_table
+open Elf_types_native_uint
+
+open Gnu_ext_dynamic
+open Gnu_ext_section_header_table
+open Gnu_ext_section_to_segment_mapping
+open Gnu_ext_symbol_versioning
+
+(*val concatS' : list string -> string -> string*)
+let rec concatS' ss accum:string=
+ ((match ss with
+ | [] -> accum
+ | s::ss -> concatS' ss (accum^s)
+ ))
+
+(*val concatS : list string -> string*)
+let concatS ss:string= (concatS' ss "")
+
+(*val harness_string_of_elf32_file_header : elf32_header -> string*)
+let harness_string_of_elf32_file_header hdr:string=
+ (unlines [
+ "ELF Header:"
+ ; (" Magic:" ^ (" " ^ unsafe_hex_string_of_uc_list (hdr.elf32_ident)))
+ ; (" Class:" ^ (" " ^ string_of_elf_file_class (get_elf32_file_class hdr)))
+ ; (" Data:" ^ (" " ^ string_of_elf_data_encoding (get_elf32_data_encoding hdr)))
+ ; (" Version:" ^ (" " ^ string_of_elf_version_number (get_elf32_version_number hdr)))
+ ; (" OS/ABI:" ^ (" " ^ string_of_elf_osabi_version ((fun y->"Architecture defined")) (get_elf32_osabi hdr)))
+ ; (" ABI Version:" ^ (" " ^ Nat_big_num.to_string (get_elf32_abi_version hdr)))
+ ; (" Type:" ^ (" " ^ string_of_elf_file_type default_os_specific_print default_proc_specific_print (Nat_big_num.of_string (Uint32.to_string hdr.elf32_type))))
+ ; (" Machine:" ^ (" " ^ string_of_elf_machine_architecture (Nat_big_num.of_string (Uint32.to_string hdr.elf32_machine))))
+ ; (" Version:" ^ (" " ^ ("0x" ^ unsafe_hex_string_of_natural( 1) (Nat_big_num.of_string (Uint32.to_string hdr.elf32_version)))))
+ ; (" Entry point address:" ^ (" " ^ ("0x" ^ unsafe_hex_string_of_natural( 1) (Nat_big_num.of_string (Uint32.to_string hdr.elf32_entry)))))
+ ; (" Start of program headers:" ^ (" " ^ (Uint32.to_string hdr.elf32_phoff ^ " (bytes into file)")))
+ ; (" Start of section headers:" ^ (" " ^ (Uint32.to_string hdr.elf32_shoff ^ " (bytes into file)")))
+ ; (" Flags:" ^ (" " ^ ("0x" ^ unsafe_hex_string_of_natural( 1) (Nat_big_num.of_string (Uint32.to_string hdr.elf32_flags)))))
+ ; (" Size of this header:" ^ (" " ^ (Uint32.to_string hdr.elf32_ehsize ^ " (bytes)")))
+ ; (" Size of program headers:" ^ (" " ^ (Uint32.to_string hdr.elf32_phentsize ^ " (bytes)")))
+ ; (" Number of program headers:" ^ (" " ^ Uint32.to_string hdr.elf32_phnum))
+ ; (" Size of section headers:" ^ (" " ^ (Uint32.to_string hdr.elf32_shentsize ^ " (bytes)")))
+ ; (" Number of section headers:" ^ (" " ^ Uint32.to_string hdr.elf32_shnum))
+ ; (" Section header string table index:" ^ (" " ^ Uint32.to_string hdr.elf32_shstrndx))
+ ])
+
+(*val harness_string_of_elf64_file_header : elf64_header -> string*)
+let harness_string_of_elf64_file_header hdr:string=
+ (unlines [
+ "ELF Header:"
+ ; (" Magic:" ^ (" " ^ unsafe_hex_string_of_uc_list (hdr.elf64_ident)))
+ ; (" Class:" ^ (" " ^ string_of_elf_file_class (get_elf64_file_class hdr)))
+ ; (" Data:" ^ (" " ^ string_of_elf_data_encoding (get_elf64_data_encoding hdr)))
+ ; (" Version:" ^ (" " ^ string_of_elf_version_number (get_elf64_version_number hdr)))
+ ; (" OS/ABI:" ^ (" " ^ string_of_elf_osabi_version ((fun y->"Architecture defined")) (get_elf64_osabi hdr)))
+ ; (" ABI Version:" ^ (" " ^ Nat_big_num.to_string (get_elf64_abi_version hdr)))
+ ; (" Type:" ^ (" " ^ string_of_elf_file_type default_os_specific_print default_proc_specific_print (Nat_big_num.of_string (Uint32.to_string hdr.elf64_type))))
+ ; (" Machine:" ^ (" " ^ string_of_elf_machine_architecture (Nat_big_num.of_string (Uint32.to_string hdr.elf64_machine))))
+ ; (" Version:" ^ (" " ^ ("0x" ^ unsafe_hex_string_of_natural( 1) (Nat_big_num.of_string (Uint32.to_string hdr.elf64_version)))))
+ ; (" Entry point address:" ^ (" " ^ ("0x" ^ unsafe_hex_string_of_natural( 1) (Ml_bindings.nat_big_num_of_uint64 hdr.elf64_entry))))
+ ; (" Start of program headers:" ^ (" " ^ (Uint64.to_string hdr.elf64_phoff ^ " (bytes into file)")))
+ ; (" Start of section headers:" ^ (" " ^ (Uint64.to_string hdr.elf64_shoff ^ " (bytes into file)")))
+ ; (" Flags:" ^ (" " ^ ("0x" ^ unsafe_hex_string_of_natural( 1) (Nat_big_num.of_string (Uint32.to_string hdr.elf64_flags)))))
+ ; (" Size of this header:" ^ (" " ^ (Uint32.to_string hdr.elf64_ehsize ^ " (bytes)")))
+ ; (" Size of program headers:" ^ (" " ^ (Uint32.to_string hdr.elf64_phentsize ^ " (bytes)")))
+ ; (" Number of program headers:" ^ (" " ^ Uint32.to_string hdr.elf64_phnum))
+ ; (" Size of section headers:" ^ (" " ^ (Uint32.to_string hdr.elf64_shentsize ^ " (bytes)")))
+ ; (" Number of section headers:" ^ (" " ^ Uint32.to_string hdr.elf64_shnum))
+ ; (" Section header string table index:" ^ (" " ^ Uint32.to_string hdr.elf64_shstrndx))
+ ])
+
+(*val harness_string_of_elf32_program_header_table_entry : (natural -> string) -> (natural -> string) -> byte_sequence -> elf32_program_header_table_entry -> string*)
+let harness_string_of_elf32_program_header_table_entry os proc bs0 pent:string=
+ (let typ = (string_of_segment_type os proc (Nat_big_num.of_string (Uint32.to_string pent.elf32_p_type))) in
+ let typ_s =
+(let len = (Nat_num.nat_monus( 15) (String.length typ)) in
+ if len <= 0 then
+ ""
+ else
+ concatS (replicate0 (Nat_big_num.of_int len) " "))
+ in
+ concatS [
+ " "
+ ; typ ; typ_s
+ ; ("0x" ^ unsafe_hex_string_of_natural( 6) (Nat_big_num.of_string (Uint32.to_string pent.elf32_p_offset)))
+ ; " "
+ ; ("0x" ^ unsafe_hex_string_of_natural( 8) (Nat_big_num.of_string (Uint32.to_string pent.elf32_p_vaddr)))
+ ; " "
+ ; ("0x" ^ unsafe_hex_string_of_natural( 8) (Nat_big_num.of_string (Uint32.to_string pent.elf32_p_paddr)))
+ ; " "
+ ; ("0x" ^ unsafe_hex_string_of_natural( 5) (Nat_big_num.of_string (Uint32.to_string pent.elf32_p_filesz)))
+ ; " "
+ ; ("0x" ^ unsafe_hex_string_of_natural( 5) (Nat_big_num.of_string (Uint32.to_string pent.elf32_p_memsz)))
+ ; " "
+ ; string_of_elf_segment_permissions (Nat_big_num.of_string (Uint32.to_string pent.elf32_p_flags))
+ ; " "
+ ; ("0x" ^ unsafe_hex_string_of_natural( 1) (Nat_big_num.of_string (Uint32.to_string pent.elf32_p_align)))
+ ] ^
+(if Nat_big_num.equal (Nat_big_num.of_string (Uint32.to_string pent.elf32_p_type)) elf_pt_interp then
+ (match Elf_program_header_table.get_elf32_requested_interpreter pent bs0 with
+ | Fail f -> "\n [Requesting program interpreter: " ^ (f ^ "]")
+ | Success s -> "\n [Requesting program interpreter: " ^ (s ^ "]")
+ )
+ else
+ ""))
+
+(*val harness_string_of_elf64_program_header_table_entry : (natural -> string) -> (natural -> string) -> byte_sequence -> elf64_program_header_table_entry -> string*)
+let harness_string_of_elf64_program_header_table_entry os proc bs0 pent:string=
+ (let typ = (string_of_segment_type os proc (Nat_big_num.of_string (Uint32.to_string pent.elf64_p_type))) in
+ let typ_s =
+(let len = (Nat_num.nat_monus( 15) (String.length typ)) in
+ if len <= 0 then
+ ""
+ else
+ concatS (replicate0 (Nat_big_num.of_int len) " "))
+ in
+ concatS [
+ " "
+ ; typ ; typ_s
+ ; ("0x" ^ unsafe_hex_string_of_natural( 6) (Nat_big_num.of_string (Uint64.to_string pent.elf64_p_offset)))
+ ; " "
+ ; ("0x" ^ unsafe_hex_string_of_natural( 16) (Ml_bindings.nat_big_num_of_uint64 pent.elf64_p_vaddr))
+ ; " "
+ ; ("0x" ^ unsafe_hex_string_of_natural( 16) (Ml_bindings.nat_big_num_of_uint64 pent.elf64_p_paddr))
+ ; " "
+ ; ("0x" ^ unsafe_hex_string_of_natural( 6) (Ml_bindings.nat_big_num_of_uint64 pent.elf64_p_filesz))
+ ; " "
+ ; ("0x" ^ unsafe_hex_string_of_natural( 6) (Ml_bindings.nat_big_num_of_uint64 pent.elf64_p_memsz))
+ ; " "
+ ; string_of_elf_segment_permissions (Nat_big_num.of_string (Uint32.to_string pent.elf64_p_flags))
+ ; " "
+ ; ("0x" ^ unsafe_hex_string_of_natural( 1) (Ml_bindings.nat_big_num_of_uint64 pent.elf64_p_align))
+ ] ^
+(if Nat_big_num.equal (Nat_big_num.of_string (Uint32.to_string pent.elf64_p_type)) elf_pt_interp then
+ (match Elf_program_header_table.get_elf64_requested_interpreter pent bs0 with
+ | Fail f -> "\n [Requesting program interpreter: " ^ (f ^ "]")
+ | Success s -> "\n [Requesting program interpreter: " ^ (s ^ "]")
+ )
+ else
+ ""))
+
+(*val harness_string_of_efl32_pht : (natural -> string) -> (natural -> string) -> elf32_program_header_table -> byte_sequence -> string*)
+let harness_string_of_elf32_pht os proc pht bs0:string=
+ (" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n" ^
+ unlines (Lem_list.map (harness_string_of_elf32_program_header_table_entry os proc bs0) pht))
+
+(*val harness_string_of_efl64_pht : (natural -> string) -> (natural -> string) -> elf64_program_header_table -> byte_sequence -> string*)
+let harness_string_of_elf64_pht os proc pht bs0:string=
+ (" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n" ^
+ unlines (Lem_list.map (harness_string_of_elf64_program_header_table_entry os proc bs0) pht))
+
+(*val harness_string_of_elf32_segment_section_mappings : elf32_header -> elf32_program_header_table -> elf32_section_header_table -> string_table -> string*)
+let harness_string_of_elf32_segment_section_mappings hdr pht sht stbl:string=
+ (let map1 =
+(Lem_list.mapi (fun i -> fun pent ->
+ let mapping =
+((match get_elf32_section_to_segment_mapping hdr sht pent elf32_section_in_segment stbl with
+ | Fail err -> [("ERR: " ^ err)]
+ | Success mp -> intercalate " " mp
+ ))
+ in
+ let str =
+(let temp = (concatS mapping) in
+ if temp = "" then
+ temp
+ else
+ temp ^ " ")
+ in
+ concatS [
+(" " ^ Ml_bindings.hex_string_of_nat_pad2 i)
+ ; " "
+ ; str
+ ]
+ ) pht)
+ in
+ concatS (intercalate "\n" map1))
+
+(*val harness_string_of_elf64_segment_section_mappings : elf64_header -> elf64_program_header_table -> elf64_section_header_table -> string_table -> string*)
+let harness_string_of_elf64_segment_section_mappings hdr pht sht stbl:string=
+ (let map1 =
+(Lem_list.mapi (fun i -> fun pent ->
+ let mapping =
+((match get_elf64_section_to_segment_mapping hdr sht pent elf64_section_in_segment stbl with
+ | Fail err -> [("ERR: " ^ err)]
+ | Success mp -> intercalate " " mp
+ ))
+ in
+ let str =
+(let temp = (concatS mapping) in
+ if temp = "" then
+ temp
+ else
+ temp ^ " ")
+ in
+ concatS [
+(" " ^ Ml_bindings.hex_string_of_nat_pad2 i)
+ ; " "
+ ; str
+ ]
+ ) pht)
+ in
+ concatS (intercalate "\n" map1))
+
+(*val harness_string_of_elf32_program_headers : (natural -> string) -> (natural -> string) -> elf32_header -> elf32_program_header_table -> elf32_section_header_table -> string_table -> byte_sequence -> string*)
+let harness_string_of_elf32_program_headers os proc hdr pht sht stbl bs0:string=
+ (let pht_len = (List.length pht) in
+ if pht_len = 0 then
+ "\nThere are no program headers in this file."
+ else
+ unlines [
+ ""
+ ; ("Elf file type is " ^ string_of_elf_file_type default_os_specific_print default_proc_specific_print (Nat_big_num.of_string (Uint32.to_string hdr.elf32_type)))
+ ; ("Entry point " ^ ("0x" ^ unsafe_hex_string_of_natural( 1) (Nat_big_num.of_string (Uint32.to_string hdr.elf32_entry))))
+ ; ("There are " ^ (Pervasives.string_of_int (List.length pht) ^ (" program headers, starting at offset " ^ Uint32.to_string hdr.elf32_phoff)))
+ ; ""
+ ; "Program Headers:"
+ ; harness_string_of_elf32_pht os proc pht bs0
+ ; ""
+ ; " Section to Segment mapping:"
+ ; " Segment Sections..."
+ ; harness_string_of_elf32_segment_section_mappings hdr pht sht stbl
+ ])
+
+(*val harness_string_of_elf64_program_headers : (natural -> string) -> (natural -> string) -> elf64_header -> elf64_program_header_table -> elf64_section_header_table -> string_table -> byte_sequence -> string*)
+let harness_string_of_elf64_program_headers os proc hdr pht sht stbl bs0:string=
+ (let pht_len = (List.length pht) in
+ if pht_len = 0 then
+ "\nThere are no program headers in this file."
+ else
+ unlines [
+ ""
+ ; ("Elf file type is " ^ string_of_elf_file_type default_os_specific_print default_proc_specific_print (Nat_big_num.of_string (Uint32.to_string hdr.elf64_type)))
+ ; ("Entry point " ^ ("0x" ^ unsafe_hex_string_of_natural( 1) (Ml_bindings.nat_big_num_of_uint64 hdr.elf64_entry)))
+ ; ("There are " ^ (Pervasives.string_of_int (List.length pht) ^ (" program headers, starting at offset " ^ Uint64.to_string hdr.elf64_phoff)))
+ ; ""
+ ; "Program Headers:"
+ ; harness_string_of_elf64_pht os proc pht bs0
+ ; ""
+ ; " Section to Segment mapping:"
+ ; " Segment Sections..."
+ ; harness_string_of_elf64_segment_section_mappings hdr pht sht stbl
+ ])
+
+(*val harness_sht32_flag_legend : string*)
+let harness_sht32_flag_legend:string=
+ "\nKey to Flags:
+ W (write), A (alloc), X (execute), M (merge), S (strings)
+ I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
+ O (extra OS processing required) o (OS specific), p (processor specific)"
+
+(*val harness_sht64_flag_legend : natural -> string*)
+let harness_sht64_flag_legend mach:string=
+ (if Nat_big_num.equal mach elf_ma_x86_64 || (Nat_big_num.equal
+ mach elf_ma_l10m || Nat_big_num.equal
+ mach elf_ma_k10m) then
+ "\nKey to Flags:
+ W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
+ I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
+ O (extra OS processing required) o (OS specific), p (processor specific)"
+ else
+ "\nKey to Flags:
+ W (write), A (alloc), X (execute), M (merge), S (strings)
+ I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
+ O (extra OS processing required) o (OS specific), p (processor specific)")
+
+(*val harness_string_of_elf32_sht : (natural -> string) -> (natural -> string) -> (natural -> string) -> elf32_section_header_table -> string_table -> string*)
+let harness_string_of_elf32_sht os proc usr sht stbl:string=
+ (" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n" ^
+ unlines (Lem_list.mapi (fun i -> fun sec ->
+ let is =
+(let temp = (Pervasives.string_of_int i) in
+ if String.length temp = 1 then
+ " " ^ temp
+ else
+ temp)
+ in
+ let str = (" [" ^ (is ^ "]")) in
+ let ((gap : string), name1) =
+((match String_table.get_string_at (Nat_big_num.of_string (Uint32.to_string sec.elf32_sh_name)) stbl with
+ | Fail err -> ("", ("ERR " ^ err))
+ | Success nm ->
+ if Nat_big_num.equal (Nat_big_num.of_string (Uint32.to_string sec.elf32_sh_type)) sht_null then
+ let gap = (List.fold_right (^) (Missing_pervasives.replicate0(Nat_big_num.of_int 17) " ") " ") in
+ (gap, "")
+ else
+ let glen = (Nat_big_num.of_int ( Nat_num.nat_monus( 17) (String.length nm))) in
+ let gap = (List.fold_right (^) (Missing_pervasives.replicate0 glen " ") " ") in
+ (gap, nm)
+ ))
+ in
+ let str = (str ^ (" " ^ (name1 ^ gap))) in
+ let typ = (string_of_section_type os proc usr (Nat_big_num.of_string (Uint32.to_string sec.elf32_sh_type))) in
+ let str = (str ^ typ) in
+ let (gap, addr) =
+(let mx = (Nat_big_num.of_int ( Nat_num.nat_monus( 15) (String.length typ))) in
+ let gap = (List.fold_right (^) (Missing_pervasives.replicate0 mx " ") " ") in
+ (gap, unsafe_hex_string_of_natural( 8) (Nat_big_num.of_string (Uint32.to_string sec.elf32_sh_addr))))
+ in
+ let str = (str ^ (gap ^ addr)) in
+ let off = (unsafe_hex_string_of_natural( 6) (Nat_big_num.of_string (Uint32.to_string sec.elf32_sh_offset))) in
+ let str = (str ^ (" " ^ off)) in
+ let size2 = (unsafe_hex_string_of_natural( 6) (Nat_big_num.of_string (Uint32.to_string sec.elf32_sh_size))) in
+ let str = (str ^ (" " ^ size2)) in
+ let es = (unsafe_hex_string_of_natural( 2) (Nat_big_num.of_string (Uint32.to_string sec.elf32_sh_entsize))) in
+ let str = (str ^ (" " ^ es)) in
+ let flg = (string_of_section_flags os proc (Nat_big_num.of_string (Uint32.to_string sec.elf32_sh_flags))) in
+ let str = (str ^ (" " ^ flg)) in
+ let (gap, lnk) =
+(let l = (Nat_big_num.to_string (Nat_big_num.of_string (Uint32.to_string sec.elf32_sh_link))) in
+ let gp = (Nat_big_num.of_int ( Nat_num.nat_monus( 2) (String.length l))) in
+ let gp = (List.fold_right (^) (replicate0 gp " ") " ") in
+ (gp, l))
+ in
+ let str = (str ^ (gap ^ lnk)) in
+ let (gap, info) =
+(let i = (Nat_big_num.to_string (Nat_big_num.of_string (Uint32.to_string sec.elf32_sh_info))) in
+ let gp = (Nat_big_num.of_int ( Nat_num.nat_monus( 3) (String.length i))) in
+ let gp = (List.fold_right (^) (replicate0 gp " ") " ") in
+ (gp, i))
+ in
+ let str = (str ^ (gap ^ info)) in
+ let (gap, align) =
+(let a = (Nat_big_num.to_string (Nat_big_num.of_string (Uint32.to_string sec.elf32_sh_addralign))) in
+ let gp = (Nat_big_num.of_int ( Nat_num.nat_monus( 2) (String.length a))) in
+ let gp = (List.fold_right (^) (replicate0 gp " ") " ") in
+ (gp, a))
+ in
+ let str = (str ^ (gap ^ align)) in
+ str) sht))
+
+(*val harness_string_of_elf64_sht : (natural -> string) -> (natural -> string) -> (natural -> string) -> elf64_section_header_table -> string_table -> string*)
+let harness_string_of_elf64_sht os proc usr sht stbl:string=
+ (" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n" ^
+ unlines (Lem_list.mapi (fun i -> fun sec ->
+ let is =
+(let temp = (Pervasives.string_of_int i) in
+ if String.length temp = 1 then
+ " " ^ temp
+ else
+ temp)
+ in
+ let str = (" [" ^ (is ^ "]")) in
+ let ((gap : string), name1) =
+((match String_table.get_string_at (Nat_big_num.of_string (Uint32.to_string sec.elf64_sh_name)) stbl with
+ | Fail err -> ("", ("ERR " ^ err))
+ | Success nm ->
+ if Nat_big_num.equal (Nat_big_num.of_string (Uint32.to_string sec.elf64_sh_type)) sht_null then
+ let gap = (List.fold_right (^) (Missing_pervasives.replicate0(Nat_big_num.of_int 17) " ") " ") in
+ (gap, "")
+ else
+ let glen = (Nat_big_num.of_int ( Nat_num.nat_monus( 17) (String.length nm))) in
+ let gap = (List.fold_right (^) (Missing_pervasives.replicate0 glen " ") " ") in
+ (gap, nm)
+ ))
+ in
+ let str = (str ^ (" " ^ (name1 ^ gap))) in
+ let typ = (string_of_section_type os proc usr (Nat_big_num.of_string (Uint32.to_string sec.elf64_sh_type))) in
+ let str = (str ^ typ) in
+ let (gap, addr) =
+(let mx = (Nat_big_num.of_int ( Nat_num.nat_monus( 15) (String.length typ))) in
+ let gap = (List.fold_right (^) (Missing_pervasives.replicate0 mx " ") " ") in
+ (gap, unsafe_hex_string_of_natural( 16) (Ml_bindings.nat_big_num_of_uint64 sec.elf64_sh_addr)))
+ in
+ let str = (str ^ (gap ^ addr)) in
+ let off = (unsafe_hex_string_of_natural( 6) (Nat_big_num.of_string (Uint64.to_string sec.elf64_sh_offset))) in
+ let str = (str ^ (" " ^ off)) in
+ let size2 = (unsafe_hex_string_of_natural( 6) (Ml_bindings.nat_big_num_of_uint64 sec.elf64_sh_size)) in
+ let str = (str ^ (" " ^ size2)) in
+ let es = (unsafe_hex_string_of_natural( 2) (Ml_bindings.nat_big_num_of_uint64 sec.elf64_sh_entsize)) in
+ let str = (str ^ (" " ^ es)) in
+ let flg = (string_of_section_flags os proc (Ml_bindings.nat_big_num_of_uint64 sec.elf64_sh_flags)) in
+ let str = (str ^ (" " ^ flg)) in
+ let (gap, lnk) =
+(let l = (Nat_big_num.to_string (Nat_big_num.of_string (Uint32.to_string sec.elf64_sh_link))) in
+ let gp = (Nat_big_num.of_int ( Nat_num.nat_monus( 2) (String.length l))) in
+ let gp = (List.fold_right (^) (replicate0 gp " ") " ") in
+ (gp, l))
+ in
+ let str = (str ^ (gap ^ lnk)) in
+ let (gap, info) =
+(let i = (Nat_big_num.to_string (Nat_big_num.of_string (Uint32.to_string sec.elf64_sh_info))) in
+ let gp = (Nat_big_num.of_int ( Nat_num.nat_monus( 3) (String.length i))) in
+ let gp = (List.fold_right (^) (replicate0 gp " ") " ") in
+ (gp, i))
+ in
+ let str = (str ^ (gap ^ info)) in
+ let (gap, align) =
+(let a = (Nat_big_num.to_string (Ml_bindings.nat_big_num_of_uint64 sec.elf64_sh_addralign)) in
+ let gp = (Nat_big_num.of_int ( Nat_num.nat_monus( 2) (String.length a))) in
+ let gp = (List.fold_right (^) (replicate0 gp " ") " ") in
+ (gp, a))
+ in
+ let str = (str ^ (gap ^ align)) in
+ str) sht))
+
+
+(*val harness_string_of_elf32_section_headers : (natural -> string) -> (natural -> string) -> (natural -> string) -> elf32_header -> elf32_section_header_table -> string_table -> string*)
+let harness_string_of_elf32_section_headers os proc usr hdr sht stbl:string=
+ (unlines [
+("There are " ^ (Pervasives.string_of_int (List.length sht) ^ (" section headers, starting at offset 0x" ^ (unsafe_hex_string_of_natural( 0) (Nat_big_num.of_string (Uint32.to_string hdr.elf32_shoff)) ^ ":"))))
+ ; ""
+ ; "Section Headers:"
+ ; harness_string_of_elf32_sht os proc usr sht stbl
+ ] ^ harness_sht32_flag_legend)
+
+(*val harness_string_of_elf64_section_headers : (natural -> string) -> (natural -> string) -> (natural -> string) -> elf64_header -> elf64_section_header_table -> string_table -> string*)
+let harness_string_of_elf64_section_headers os proc usr hdr sht stbl:string=
+ (unlines [
+("There are " ^ (Pervasives.string_of_int (List.length sht) ^ (" section headers, starting at offset 0x" ^ (unsafe_hex_string_of_natural( 0) (Nat_big_num.of_string (Uint64.to_string hdr.elf64_shoff)) ^ ":"))))
+ ; ""
+ ; "Section Headers:"
+ ; harness_string_of_elf64_sht os proc usr sht stbl
+ ] ^ harness_sht64_flag_legend (Nat_big_num.of_string (Uint32.to_string hdr.elf64_machine)))
+
+(*val harness_string_of_elf32_reloc_entry : (natural -> string) -> elf32_section_header_table ->
+ elf32_symbol_table -> string_table -> string_table -> elf32_relocation -> string*)
+let harness_string_of_elf32_reloc_entry os sht symtab stbl sechdr_stbl rel:string=
+ (let off = (Nat_big_num.of_string (Uint32.to_string rel.elf32_r_offset)) in
+ let inf = (Nat_big_num.of_string (Uint32.to_string rel.elf32_r_info)) in
+ let typ = (Missing_pervasives.unsafe_string_take(Nat_big_num.of_int 22) (os (extract_elf32_relocation_r_type rel.elf32_r_info))) in
+ let typs =
+(let len = (Nat_big_num.of_int ( Nat_num.nat_monus( 22) (String.length typ))) in
+ concatS (replicate0 len " "))
+ in
+ let idx1 = (extract_elf32_relocation_r_sym rel.elf32_r_info) in
+ (match Lem_list.list_index symtab (Nat_big_num.to_int idx1) with
+ | None -> "harness_string_of_elf32_reloc_entry: Nothing returned"
+ | Some sym ->
+ let (nm, value, symtyp, secthdr) =
+((match Lem_list.list_index symtab (Nat_big_num.to_int idx1) with
+ | None -> (stn_undef,Nat_big_num.of_int 0,Nat_big_num.of_int 0,Nat_big_num.of_int 0)
+ | Some sym -> (Nat_big_num.of_string (Uint32.to_string sym.elf32_st_name),
+ Nat_big_num.of_string (Uint32.to_string sym.elf32_st_value), get_elf32_symbol_type sym,
+ Nat_big_num.of_string (Uint32.to_string sym.elf32_st_shndx))
+ ))
+ in
+ if Nat_big_num.equal symtyp stt_section then
+ let vlu = (" " ^ unsafe_hex_string_of_natural( 8) value) in
+ let nm =
+((match Lem_list.list_index sht (Nat_big_num.to_int secthdr) with
+ | None -> "XXX"
+ | Some shdr ->
+ (match String_table.get_string_at (Nat_big_num.of_string (Uint32.to_string shdr.elf32_sh_name)) sechdr_stbl with
+ | Fail f -> f
+ | Success n -> n
+ )
+ ))
+ in
+ concatS [
+ unsafe_hex_string_of_natural( 8) off
+ ; " "
+ ; unsafe_hex_string_of_natural( 8) inf
+ ; " "
+ ; typ
+ ; typs
+ ; vlu
+ ; " "
+ ; nm
+ ]
+ else if Nat_big_num.equal nm stn_undef then
+ concatS [
+ unsafe_hex_string_of_natural( 8) off
+ ; " "
+ ; unsafe_hex_string_of_natural( 8) inf
+ ; " "
+ ; typ
+ ; typs
+ ]
+ else
+ let vlu = (" " ^ unsafe_hex_string_of_natural( 8) (Nat_big_num.of_string (Uint32.to_string sym.elf32_st_value))) in
+ let nm =
+((match String_table.get_string_at nm stbl with
+ | Fail f -> f
+ | Success n -> n
+ ))
+ in
+ concatS [
+ unsafe_hex_string_of_natural( 8) off
+ ; " "
+ ; unsafe_hex_string_of_natural( 8) inf
+ ; " "
+ ; typ
+ ; typs
+ ; vlu
+ ; " "
+ ; nm
+ ]
+ ))
+
+(*val harness_string_of_elf64_reloc_a_entry : (natural -> string) -> elf64_symbol_table ->
+ elf64_section_header_table -> string_table -> string_table -> elf64_relocation_a -> string*)
+let harness_string_of_elf64_reloc_a_entry os symtab sht stbl sechdr_stbl rel:string=
+ (let off = (Ml_bindings.nat_big_num_of_uint64 rel.elf64_ra_offset) in
+ let inf = (Ml_bindings.nat_big_num_of_uint64 rel.elf64_ra_info) in
+ let add = (Nat_big_num.of_int64 rel.elf64_ra_addend) in
+ let typ = (Missing_pervasives.unsafe_string_take(Nat_big_num.of_int 22) (os (extract_elf64_relocation_r_type rel.elf64_ra_info))) in
+ let typs =
+(let len = (Nat_big_num.of_int ( Nat_num.nat_monus( 22) (String.length typ))) in
+ concatS (replicate0 len " "))
+ in
+ let idx1 = (extract_elf64_relocation_r_sym rel.elf64_ra_info) in
+ let (nm, value, symtyp, secthdr) =
+((match Lem_list.list_index symtab (Nat_big_num.to_int idx1) with
+ | None -> (stn_undef,Nat_big_num.of_int 0,Nat_big_num.of_int 0,Nat_big_num.of_int 0)
+ | Some sym -> (Nat_big_num.of_string (Uint32.to_string sym.elf64_st_name),
+ Ml_bindings.nat_big_num_of_uint64 sym.elf64_st_value, get_elf64_symbol_type sym,
+ Nat_big_num.of_string (Uint32.to_string sym.elf64_st_shndx))
+ ))
+ in
+ if Nat_big_num.equal symtyp stt_section then
+ let vlu = (" " ^ unsafe_hex_string_of_natural( 16) value) in
+ let nm =
+((match Lem_list.list_index sht (Nat_big_num.to_int secthdr) with
+ | None -> "XXX"
+ | Some shdr ->
+ (match String_table.get_string_at (Nat_big_num.of_string (Uint32.to_string shdr.elf64_sh_name)) sechdr_stbl with
+ | Fail f -> f
+ | Success n -> n
+ )
+ ))
+ in
+ concatS [
+ unsafe_hex_string_of_natural( 16) off
+ ; " "
+ ; unsafe_hex_string_of_natural( 16) inf
+ ; " "
+ ; typ
+ ; typs
+ ; vlu
+ ; " "
+ ; nm
+ ; " + "
+ ; Ml_bindings.hex_string_of_big_int_no_padding add
+ ]
+ else if Nat_big_num.equal nm stn_undef then
+ concatS [
+ unsafe_hex_string_of_natural( 16) off
+ ; " "
+ ; unsafe_hex_string_of_natural( 16) inf
+ ; " "
+ ; typ
+ ; typs
+ ; " "
+ ; Ml_bindings.hex_string_of_big_int_no_padding add
+ ]
+ else
+ let vlu = (" " ^ unsafe_hex_string_of_natural( 16) value) in
+ let nm =
+((match String_table.get_string_at nm stbl with
+ | Fail f -> f
+ | Success n -> n
+ ))
+ in
+ concatS [
+ unsafe_hex_string_of_natural( 16) off
+ ; " "
+ ; unsafe_hex_string_of_natural( 16) inf
+ ; " "
+ ; typ
+ ; typs
+ ; vlu
+ ; " "
+ ; nm
+ ; " + "
+ ; Ml_bindings.hex_string_of_big_int_no_padding add
+ ])
+
+(*val harness_string_of_elf32_relocs' : endianness -> (natural -> string) -> elf32_file -> elf32_section_header_table ->
+ elf32_section_header_table -> string_table -> string_table -> byte_sequence -> string*)
+let harness_string_of_elf32_relocs' endian os f1 sht_relocs sht shdr stbl bs0:string=
+ (let rels =
+(mapM (fun ent ->
+ let off = (Nat_big_num.of_string (Uint32.to_string ent.elf32_sh_offset)) in
+ let siz = (Nat_big_num.of_string (Uint32.to_string ent.elf32_sh_size)) in
+ let lnk = (Nat_big_num.of_string (Uint32.to_string ent.elf32_sh_link)) in
+ Byte_sequence.offset_and_cut off siz bs0 >>= (fun rels ->
+ Elf_relocation.read_elf32_relocation_section' endian rels >>= (fun sect ->
+ Elf_file.get_elf32_symbol_table_by_index f1 lnk >>= (fun symtab ->
+ return (sect, ent, symtab))))
+ ) sht_relocs
+ >>=
+ mapM (fun (rels, ent, symtab) ->
+ let nm = (Nat_big_num.of_string (Uint32.to_string ent.elf32_sh_name)) in
+ let off = (unsafe_hex_string_of_natural( 0) (Nat_big_num.of_string (Uint32.to_string ent.elf32_sh_offset))) in
+ let len = (Pervasives.string_of_int (List.length rels)) in
+ String_table.get_string_at nm shdr >>= (fun nm ->
+ let hdr = ("Relocation section '" ^ (nm ^ ("' at offset 0x" ^ (off ^ (" contains " ^ (len ^ " entries:\n")))))) in
+ let ttl = " Offset Info Type Sym. Value Symbol's Name\n" in
+ let body = (concatS (intercalate "\n" (Lem_list.map (harness_string_of_elf32_reloc_entry os sht symtab stbl shdr) rels))) in
+ return (hdr ^ (ttl ^ body)))))
+ in
+ (match rels with
+ | Fail err -> err
+ | Success s -> concatS (intercalate "\n\n" s)
+ ))
+
+(*val harness_string_of_elf64_relocs' : endianness -> (natural -> string) -> elf64_file ->
+ elf64_section_header_table -> elf64_section_header_table ->
+ string_table -> string_table -> byte_sequence -> string*)
+let harness_string_of_elf64_relocs' endian os f1 reloc_sht sht shdr stbl bs0:string=
+ (let rels =
+(mapM (fun ent ->
+ let off = (Nat_big_num.of_string (Uint64.to_string ent.elf64_sh_offset)) in
+ let siz = (Ml_bindings.nat_big_num_of_uint64 ent.elf64_sh_size) in
+ let lnk = (Nat_big_num.of_string (Uint32.to_string ent.elf64_sh_link)) in
+ Byte_sequence.offset_and_cut off siz bs0 >>= (fun rels ->
+ Elf_relocation.read_elf64_relocation_a_section' endian rels >>= (fun sect ->
+ Elf_file.get_elf64_symbol_table_by_index f1 lnk >>= (fun symtab ->
+ return (sect, ent, symtab))))
+ ) reloc_sht
+ >>=
+ mapM (fun (rels, ent, symtab) ->
+ let nm = (Nat_big_num.of_string (Uint32.to_string ent.elf64_sh_name)) in
+ let off = (unsafe_hex_string_of_natural( 0) (Nat_big_num.of_string (Uint64.to_string ent.elf64_sh_offset))) in
+ let len = (Pervasives.string_of_int (List.length rels)) in
+ String_table.get_string_at nm shdr >>= (fun nm ->
+ let hdr = ("Relocation section '" ^ (nm ^ ("' at offset 0x" ^ (off ^ (" contains " ^ (len ^ " entries:\n")))))) in
+ let ttl = " Offset Info Type Symbol's Value Symbol's Name + Addend\n" in
+ let body = (concatS (intercalate "\n" (Lem_list.map (harness_string_of_elf64_reloc_a_entry os symtab sht stbl shdr) rels))) in
+ return (hdr ^ (ttl ^ body)))))
+ in
+ (match rels with
+ | Fail err -> err
+ | Success s -> concatS (intercalate "\n\n" s)
+ ))
+
+(*val harness_string_of_elf32_relocs : elf32_file -> (natural -> string) -> byte_sequence -> string*)
+let harness_string_of_elf32_relocs f1 os bs0:string=
+ (let hdr = (f1.elf32_file_header) in
+ let sht = (f1.elf32_file_section_header_table) in
+ let endian = (get_elf32_header_endianness hdr) in
+ let rel_secs = (List.filter (fun x ->
+ x.elf32_sh_type = Uint32.of_string (Nat_big_num.to_string sht_rel)) sht) in
+ if List.length rel_secs = 0 then
+ "\nThere are no relocations in this file."
+ else
+ (match get_elf32_file_symbol_string_table f1 with
+ | Fail err -> err
+ | Success stbl ->
+ (match get_elf32_file_section_header_string_table f1 with
+ | Fail err -> err
+ | Success shdr -> "\n" ^ harness_string_of_elf32_relocs' endian os f1 rel_secs sht shdr stbl bs0
+ )
+ ))
+
+(*val harness_string_of_elf64_relocs : elf64_file -> (natural -> string) -> byte_sequence -> string*)
+let harness_string_of_elf64_relocs f1 os bs0:string=
+ (let hdr = (f1.elf64_file_header) in
+ let sht = (f1.elf64_file_section_header_table) in
+ let endian = (get_elf64_header_endianness hdr) in
+ let rel_secs = (List.filter (fun x ->
+ x.elf64_sh_type = Uint32.of_string (Nat_big_num.to_string sht_rela)) sht) in
+ if List.length rel_secs = 0 then
+ "\nThere are no relocations in this file."
+ else
+ (match get_elf64_file_symbol_string_table f1 with
+ | Fail err -> err
+ | Success stbl ->
+ (match get_elf64_file_section_header_string_table f1 with
+ | Fail err -> err
+ | Success shdr -> "\n" ^ harness_string_of_elf64_relocs' endian os f1 rel_secs sht shdr stbl bs0
+ )
+ ))
+
+(*val harness_string_of_elf32_symbol_table_entry : nat -> (natural -> string) ->
+ (natural -> string) -> byte_sequence -> string_table -> elf32_symbol_table_entry -> string*)
+let harness_string_of_elf32_symbol_table_entry num os proc bs0 stbl ent:string=
+ (let vlu = (unsafe_hex_string_of_natural( 8) (Nat_big_num.of_string (Uint32.to_string ent.elf32_st_value))) in
+ let siz = (Nat_big_num.to_string (Nat_big_num.of_string (Uint32.to_string ent.elf32_st_size))) in
+ let siz_pad =
+ (let pad = (Nat_num.nat_monus( 5) (String.length siz)) in
+ if pad = 0 then
+ ""
+ else
+ concatS (replicate0 (Nat_big_num.of_int pad) " "))
+ in
+ let typ = (string_of_symbol_type (get_elf32_symbol_type ent) os proc) in
+ let bnd = (string_of_symbol_binding (get_elf32_symbol_binding ent) os proc) in
+ let bnd_pad =
+(let pad = (Nat_num.nat_monus( 6) (String.length typ)) in
+ if pad = 0 then
+ ""
+ else
+ concatS (replicate0 (Nat_big_num.of_int pad) " "))
+ in
+ let vis = (string_of_symbol_visibility (Nat_big_num.of_string (Uint32.to_string ent.elf32_st_other))) in
+ let vis_pad =
+(let pad = (Nat_num.nat_monus( 6) (String.length bnd)) in
+ if pad = 0 then
+ ""
+ else
+ concatS (replicate0 (Nat_big_num.of_int pad) " "))
+ in
+ let ndx =
+(let tmp = (Nat_big_num.of_string (Uint32.to_string ent.elf32_st_shndx)) in
+ if Nat_big_num.equal tmp shn_undef then
+ "UND"
+ else if Nat_big_num.equal tmp shn_abs then
+ "ABS"
+ else
+ Nat_big_num.to_string tmp)
+ in
+ let ndx_pad =
+(let pad = (Nat_num.nat_monus( 3) (String.length ndx)) in
+ if pad = 0 then
+ ""
+ else
+ concatS (replicate0 (Nat_big_num.of_int pad) " "))
+ in
+ let nm =
+(let idx1 = (Nat_big_num.of_string (Uint32.to_string ent.elf32_st_name)) in
+ if Nat_big_num.equal idx1(Nat_big_num.of_int 0) then
+ ""
+ else
+ (match String_table.get_string_at idx1 stbl with
+ | Fail err -> err
+ | Success s -> s
+ ))
+ in
+ let sym = "" in
+ let num =
+(let temp = (Pervasives.string_of_int num) in
+ let pad = (Nat_num.nat_monus( 3) (String.length temp)) in
+ if pad = 0 then
+ temp
+ else
+ let spcs = (concatS (replicate0 (Nat_big_num.of_int pad) " ")) in
+ spcs ^ temp)
+ in
+ concatS [
+ " "
+ ; (num ^ ":")
+ ; " "
+ ; vlu
+ ; " "
+ ; siz_pad; siz
+ ; " "
+ ; typ
+ ; " "
+ ; bnd_pad; bnd
+ ; " "
+ ; vis_pad; vis
+ ; " "
+ ; ndx_pad; ndx
+ ; " "
+ ; nm
+ ; sym
+ ])
+
+(*val harness_string_of_elf32_syms' : endianness -> (natural -> string) -> (natural -> string) -> elf32_file -> elf32_section_header_table -> elf32_section_header_table -> string_table -> byte_sequence -> string*)
+let harness_string_of_elf32_syms' endian os proc f1 filtered_sht sht shdr bs0:string=
+ (let rels =
+(mapM (fun ent ->
+ let off = (Nat_big_num.of_string (Uint32.to_string ent.elf32_sh_offset)) in
+ let siz = (Nat_big_num.of_string (Uint32.to_string ent.elf32_sh_size)) in
+ let lnk = (Nat_big_num.of_string (Uint32.to_string ent.elf32_sh_link)) in
+ let typ = (Nat_big_num.of_string (Uint32.to_string ent.elf32_sh_type)) in
+ Byte_sequence.offset_and_cut off siz bs0 >>= (fun syms ->
+ Elf_symbol_table.read_elf32_symbol_table endian syms >>= (fun sect ->
+ Elf_file.get_elf32_string_table_by_index f1 lnk >>= (fun strtab ->
+ return (sect, ent, strtab, typ))))
+ ) filtered_sht >>= (fun sects ->
+ mapM (fun (syms, ent, strtab, typ) ->
+ let nm = (Nat_big_num.of_string (Uint32.to_string ent.elf32_sh_name)) in
+ let len = (Pervasives.string_of_int (List.length syms)) in
+ String_table.get_string_at nm shdr >>= (fun nm ->
+ let hdr = ("Symbol table '" ^ (nm ^ ("' contains " ^ (len ^ " entries:\n")))) in
+ let ttl = " Num: Value Size Type Bind Vis Ndx Name\n" in
+ let body = (concatS (intercalate "\n" (Lem_list.mapi (fun n ->
+ harness_string_of_elf32_symbol_table_entry n os proc bs0 strtab) syms)))
+ in
+ return (hdr ^ (ttl ^ body)))) sects))
+ in
+ (match rels with
+ | Fail err -> err
+ | Success s -> concatS (intercalate "\n\n" s)
+ ))
+
+(*val harness_string_of_elf32_syms : elf32_file -> (natural -> string) -> (natural -> string) -> byte_sequence -> string*)
+let harness_string_of_elf32_syms f1 os proc bs0:string=
+ (let hdr = (f1.elf32_file_header) in
+ let sht = (f1.elf32_file_section_header_table) in
+ let endian = (get_elf32_header_endianness hdr) in
+ let sym_secs = (List.filter (fun x ->
+(x.elf32_sh_type = Uint32.of_string (Nat_big_num.to_string sht_dynsym)) ||
+(x.elf32_sh_type = Uint32.of_string (Nat_big_num.to_string sht_symtab))) sht)
+ in
+ if List.length sym_secs = 0 then
+ "\nThere are no symbols in this file."
+ else
+ (match get_elf32_file_section_header_string_table f1 with
+ | Fail err -> err
+ | Success shdr ->
+ "\n" ^
+ harness_string_of_elf32_syms' endian os proc f1 sym_secs sht shdr bs0
+ ))
+
+(*val harness_string_of_elf64_symbol_table_entry : nat -> (natural -> string) -> (natural -> string) -> string_table -> elf64_symbol_table_entry -> string*)
+let harness_string_of_elf64_symbol_table_entry num os proc stbl ent:string=
+ (let vlu = (unsafe_hex_string_of_natural( 16) (Ml_bindings.nat_big_num_of_uint64 ent.elf64_st_value)) in
+ let siz = (Nat_big_num.to_string (Ml_bindings.nat_big_num_of_uint64 ent.elf64_st_size)) in
+ let siz_pad =
+ (let pad = (Nat_num.nat_monus( 5) (String.length siz)) in
+ if pad = 0 then
+ ""
+ else
+ concatS (replicate0 (Nat_big_num.of_int pad) " "))
+ in
+ let typ = (string_of_symbol_type (get_elf64_symbol_type ent) os proc) in
+ let bnd = (string_of_symbol_binding (get_elf64_symbol_binding ent) os proc) in
+ let bnd_pad =
+(let pad = (Nat_num.nat_monus( 8) (String.length typ)) in
+ if pad = 0 then
+ ""
+ else
+ concatS (replicate0 (Nat_big_num.of_int pad) " "))
+ in
+ let vis = (string_of_symbol_visibility (Nat_big_num.of_string (Uint32.to_string ent.elf64_st_other))) in
+ let vis_pad =
+(let pad = (Nat_num.nat_monus( 6) (String.length bnd)) in
+ if pad = 0 then
+ ""
+ else
+ concatS (replicate0 (Nat_big_num.of_int pad) " "))
+ in
+ let ndx =
+(let tmp = (Nat_big_num.of_string (Uint32.to_string ent.elf64_st_shndx)) in
+ if Nat_big_num.equal tmp shn_undef then
+ "UND"
+ else if Nat_big_num.equal tmp shn_abs then
+ "ABS"
+ else
+ Nat_big_num.to_string tmp)
+ in
+ let ndx_pad =
+(let pad = (Nat_num.nat_monus( 3) (String.length ndx)) in
+ if pad = 0 then
+ ""
+ else
+ concatS (replicate0 (Nat_big_num.of_int pad) " "))
+ in
+ let nm =
+(let idx1 = (Nat_big_num.of_string (Uint32.to_string ent.elf64_st_name)) in
+ if Nat_big_num.equal idx1(Nat_big_num.of_int 0) then
+ ""
+ else
+ (match String_table.get_string_at idx1 stbl with
+ | Fail err -> err
+ | Success s -> s
+ ))
+ in
+ let num =
+(let temp = (Pervasives.string_of_int num) in
+ let pad = (Nat_num.nat_monus( 3) (String.length temp)) in
+ if pad = 0 then
+ temp
+ else
+ let spcs = (concatS (replicate0 (Nat_big_num.of_int pad) " ")) in
+ spcs ^ temp)
+ in
+ concatS [
+ " "
+ ; (num ^ ":")
+ ; " "
+ ; vlu
+ ; " "
+ ; siz_pad; siz
+ ; " "
+ ; typ
+ ; bnd_pad; bnd
+ ; " "
+ ; vis_pad; vis
+ ; " "
+ ; ndx_pad; ndx
+ ; " "
+ ; nm
+ ])
+
+(*val harness_string_of_elf64_syms' : endianness -> (natural -> string) -> (natural -> string) -> elf64_file -> elf64_section_header_table -> elf64_section_header_table -> string_table -> byte_sequence -> string*)
+let harness_string_of_elf64_syms' endian os proc f1 filtered_sht sht shdr bs0:string=
+ (let rels =
+(mapM (fun ent ->
+ let off = (Nat_big_num.of_string (Uint64.to_string ent.elf64_sh_offset)) in
+ let siz = (Ml_bindings.nat_big_num_of_uint64 ent.elf64_sh_size) in
+ let lnk = (Nat_big_num.of_string (Uint32.to_string ent.elf64_sh_link)) in
+ let typ = (Nat_big_num.of_string (Uint32.to_string ent.elf64_sh_type)) in
+ Byte_sequence.offset_and_cut off siz bs0 >>= (fun syms ->
+ Elf_symbol_table.read_elf64_symbol_table endian syms >>= (fun sect ->
+ Elf_file.get_elf64_string_table_by_index f1 lnk >>= (fun strtab ->
+ return (sect, ent, strtab, typ))))
+ ) filtered_sht
+ >>=
+ mapM (fun (syms, ent, strtab, typ) ->
+ let nm = (Nat_big_num.of_string (Uint32.to_string ent.elf64_sh_name)) in
+ let len = (Pervasives.string_of_int (List.length syms)) in
+ String_table.get_string_at nm shdr >>= (fun nm ->
+ let hdr = ("Symbol table '" ^ (nm ^ ("' contains " ^ (len ^ " entries:\n")))) in
+ let ttl = " Num: Value Size Type Bind Vis Ndx Name\n" in
+ let body = (concatS (intercalate "\n" (Lem_list.mapi (fun n ->
+ harness_string_of_elf64_symbol_table_entry n os proc strtab) syms)))
+ in
+ return (hdr ^ (ttl ^ body)))))
+ in
+ (match rels with
+ | Fail err -> err
+ | Success s -> concatS (intercalate "\n\n" s)
+ ))
+
+(*val harness_string_of_elf64_syms : elf64_file -> (natural -> string) -> (natural -> string) -> byte_sequence -> string*)
+let harness_string_of_elf64_syms f1 os proc bs0:string=
+ (let hdr = (f1.elf64_file_header) in
+ let sht = (f1.elf64_file_section_header_table) in
+ let endian = (get_elf64_header_endianness hdr) in
+ let sym_secs = (List.filter (fun x ->
+(x.elf64_sh_type = Uint32.of_string (Nat_big_num.to_string sht_dynsym)) ||
+(x.elf64_sh_type = Uint32.of_string (Nat_big_num.to_string sht_symtab))) sht)
+ in
+ if List.length sym_secs = 0 then
+ "\nThere are no symbols in this file."
+ else
+ (match get_elf64_file_section_header_string_table f1 with
+ | Fail err -> err
+ | Success shdr ->
+ "\n" ^
+ harness_string_of_elf64_syms' endian os proc f1 sym_secs sht shdr bs0
+ ))
+
+(*val string_of_unix_time : natural -> string*)
+
+(*val string_of_dyn_value : forall 'addr 'size. dyn_value 'addr 'size ->
+ ('addr -> string) -> ('size -> string) -> string*)
+let string_of_dyn_value dyn addr size2:string=
+ ((match dyn with
+ | Address a -> addr a
+ | Size s -> size2 s
+ | FName f -> f
+ | Path p -> p
+ | SOName f -> "Library soname: [" ^ (f ^ "]")
+ | RPath p -> "Library rpath: [" ^ (p ^ "]")
+ | RunPath p -> "Library runpath: [" ^ (p ^ "]")
+ | Flags f -> string_of_dt_flag f
+ | Flags1 f -> "Flags: " ^ gnu_string_of_dt_flag_1 f
+ | Ignored -> ""
+ | Checksum s -> "0x" ^ unsafe_hex_string_of_natural( 0) s
+ | Library l -> "Shared library: [" ^ (l ^ "]")
+ | Numeric n -> Nat_big_num.to_string n
+ | RelType r -> string_of_rel_type r
+ | Timestamp t -> Ml_bindings.string_of_unix_time t
+ | Null -> "0x0"
+ ))
+
+(*val string_of_elf32_dyn_value : elf32_dyn_value -> string*)
+let string_of_elf32_dyn_value dyn:string=
+ (string_of_dyn_value
+ dyn
+ (fun a -> "0x" ^ unsafe_hex_string_of_natural( 0) (Nat_big_num.of_string (Uint32.to_string a)))
+ (fun s -> Uint32.to_string s ^ " (bytes)"))
+
+(*val string_of_elf64_dyn_value : elf64_dyn_value -> string*)
+let string_of_elf64_dyn_value dyn:string=
+ (string_of_dyn_value
+ dyn
+ (fun a -> "0x" ^ unsafe_hex_string_of_natural( 0) (Ml_bindings.nat_big_num_of_uint64 a))
+ (fun s -> Uint64.to_string s ^ " (bytes)"))
+
+(*val harness_string_of_elf32_dyn_entry : bool -> elf32_dyn -> (natural -> bool) -> (natural -> string) ->
+ (elf32_dyn -> string_table -> error elf32_dyn_value) ->
+ (elf32_dyn -> string_table -> error elf32_dyn_value) -> string_table -> string*)
+let harness_string_of_elf32_dyn_entry shared_object dyn os_additional_tags typ os_dyn proc_dyn stbl:string=
+ (let tag = (unsafe_hex_string_of_natural( 8) (Nat_big_num.abs (Nat_big_num.of_int32 dyn.elf32_dyn_tag))) in
+ let typ = ("(" ^ (typ (Nat_big_num.abs (Nat_big_num.of_int32 dyn.elf32_dyn_tag)) ^ ")")) in
+ let vlu =
+((match get_value_of_elf32_dyn shared_object dyn os_additional_tags os_dyn proc_dyn stbl with
+ | Fail f -> f
+ | Success v -> string_of_elf32_dyn_value v
+ ))
+ in
+ let vlu_pad =
+(let pad = (Nat_num.nat_monus( 29) (String.length typ)) in
+ if pad = 0 then
+ ""
+ else
+ let reps = (replicate0 (Nat_big_num.of_int pad) " ") in
+ concatS reps)
+ in
+ concatS [
+ " "
+ ; ("0x" ^ tag)
+ ; " "
+ ; typ
+ ; vlu_pad; vlu
+ ])
+
+(*val harness_string_of_elf32_dynamic_section' : elf32_file -> elf32_program_header_table_entry ->
+ byte_sequence -> (natural -> bool) -> (natural -> error tag_correspondence) ->
+ (natural -> error tag_correspondence) -> (natural -> string) ->
+ (elf32_dyn -> string_table -> error elf32_dyn_value) ->
+ (elf32_dyn -> string_table -> error elf32_dyn_value) -> string*)
+let harness_string_of_elf32_dynamic_section' f1 dyn bs0 os_additional_ranges os proc os_print os_dyn proc_dyn:string=
+ (let endian = (get_elf32_header_endianness f1.elf32_file_header) in
+ let sht = (f1.elf32_file_section_header_table) in
+ let off = (Nat_big_num.of_string (Uint32.to_string dyn.elf32_p_offset)) in
+ let siz = (Nat_big_num.of_string (Uint32.to_string dyn.elf32_p_filesz)) in
+ let shared_object = (is_elf32_shared_object_file f1.elf32_file_header) in
+ let res =
+(Byte_sequence.offset_and_cut off siz bs0 >>= (fun rel ->
+ obtain_elf32_dynamic_section_contents f1 os_additional_ranges os proc bs0 >>= (fun dyns ->
+ get_string_table_of_elf32_dyn_section endian dyns sht bs0 >>= (fun stbl ->
+ return (Lem_list.map (fun x -> harness_string_of_elf32_dyn_entry shared_object x os_additional_ranges os_print os_dyn proc_dyn stbl) dyns)))))
+ in
+ (match res with
+ | Fail f -> f
+ | Success s ->
+ let off = (unsafe_hex_string_of_natural( 0) off) in
+ let entries = (Pervasives.string_of_int (List.length s)) in
+ concatS [
+ "\n"
+ ; ("Dynamic section at offset 0x" ^ (off ^ (" contains " ^ (entries ^ " entries:\n"))))
+ ; " Tag Type Name/Value\n"
+ ; concatS (intercalate "\n" s)
+ ]
+ ))
+
+(*val harness_string_of_elf32_dynamic_section : elf32_file -> byte_sequence ->
+ (natural -> bool) -> (natural -> error tag_correspondence) ->
+ (natural -> error tag_correspondence) -> (natural -> string) ->
+ (elf32_dyn -> string_table -> error elf32_dyn_value) ->
+ (elf32_dyn -> string_table -> error elf32_dyn_value) -> string*)
+let harness_string_of_elf32_dynamic_section f1 bs0 os_additional_ranges os proc os_print os_dyn proc_dyn:string=
+ (let pht = (f1.elf32_file_program_header_table) in
+ let dyn =
+(List.filter (fun x ->
+ x.elf32_p_type = Uint32.of_string (Nat_big_num.to_string elf_pt_dynamic)
+ ) pht)
+ in
+ let print_msg = (is_elf32_shared_object_file f1.elf32_file_header ||
+ is_elf32_executable_file f1.elf32_file_header)
+ in
+ (match dyn with
+ | [] ->
+ if print_msg then
+ "\nThere is no dynamic section in this file."
+ else
+ ""
+ | [x] -> harness_string_of_elf32_dynamic_section' f1 x bs0 os_additional_ranges os proc os_print os_dyn proc_dyn
+ | _ -> "Multiple dynamic sections detected."
+ ))
+
+(*val harness_string_of_elf64_dyn_entry : bool -> elf64_dyn -> (natural -> bool) -> (natural -> string) ->
+ (elf64_dyn -> string_table -> error elf64_dyn_value) ->
+ (elf64_dyn -> string_table -> error elf64_dyn_value) -> string_table -> string*)
+let harness_string_of_elf64_dyn_entry shared_object dyn os_additional_ranges typ os_dyn proc_dyn stbl:string=
+ (let tag = (unsafe_hex_string_of_natural( 16) (Nat_big_num.abs (Nat_big_num.of_int64 dyn.elf64_dyn_tag))) in
+ let typ = ("(" ^ (typ (Nat_big_num.abs (Nat_big_num.of_int64 dyn.elf64_dyn_tag)) ^ ")")) in
+ let vlu =
+((match get_value_of_elf64_dyn shared_object dyn os_additional_ranges os_dyn proc_dyn stbl with
+ | Fail f -> f
+ | Success v -> string_of_elf64_dyn_value v
+ ))
+ in
+ let vlu_pad =
+(let pad = (Nat_num.nat_monus( 21) (String.length typ)) in
+ if pad = 0 then
+ ""
+ else
+ let reps = (replicate0 (Nat_big_num.of_int pad) " ") in
+ concatS reps)
+ in
+ concatS [
+ " "
+ ; ("0x" ^ tag)
+ ; " "
+ ; typ
+ ; vlu_pad; vlu
+ ])
+
+(*val harness_string_of_elf64_dynamic_section' : elf64_file -> elf64_program_header_table_entry ->
+ byte_sequence -> (natural -> bool) -> (natural -> error tag_correspondence) ->
+ (natural -> error tag_correspondence) -> (natural -> string) ->
+ (elf64_dyn -> string_table -> error elf64_dyn_value) ->
+ (elf64_dyn -> string_table -> error elf64_dyn_value) -> string*)
+let harness_string_of_elf64_dynamic_section' f1 dyn bs0 os_additional_ranges os proc os_print os_dyn proc_dyn:string=
+ (let endian = (get_elf64_header_endianness f1.elf64_file_header) in
+ let sht = (f1.elf64_file_section_header_table) in
+ let off = (Nat_big_num.of_string (Uint64.to_string dyn.elf64_p_offset)) in
+ let siz = (Ml_bindings.nat_big_num_of_uint64 dyn.elf64_p_filesz) in
+ let shared_object = (is_elf64_shared_object_file f1.elf64_file_header) in
+ let res =
+(Byte_sequence.offset_and_cut off siz bs0 >>= (fun rel ->
+ obtain_elf64_dynamic_section_contents f1 os_additional_ranges os proc bs0 >>= (fun dyns ->
+ get_string_table_of_elf64_dyn_section endian dyns sht bs0 >>= (fun stbl ->
+ return (Lem_list.map (fun x -> harness_string_of_elf64_dyn_entry shared_object x os_additional_ranges os_print os_dyn proc_dyn stbl) dyns)))))
+ in
+ (match res with
+ | Fail f -> f
+ | Success s ->
+ let off = (unsafe_hex_string_of_natural( 0) off) in
+ let entries = (Pervasives.string_of_int (List.length s)) in
+ concatS [
+ "\n"
+ ; ("Dynamic section at offset 0x" ^ (off ^ (" contains " ^ (entries ^ " entries:\n"))))
+ ; " Tag Type Name/Value\n"
+ ; concatS (intercalate "\n" s)
+ ]
+ ))
+
+(*val harness_string_of_elf64_dynamic_section : elf64_file -> byte_sequence ->
+ (natural -> bool) -> (natural -> error tag_correspondence) ->
+ (natural -> error tag_correspondence) -> (natural -> string) ->
+ (elf64_dyn -> string_table -> error elf64_dyn_value) ->
+ (elf64_dyn -> string_table -> error elf64_dyn_value) -> string*)
+let harness_string_of_elf64_dynamic_section f1 bs0 os_additional_ranges os proc os_print os_dyn proc_dyn:string=
+ (let pht = (f1.elf64_file_program_header_table) in
+ let print_msg = (is_elf64_shared_object_file f1.elf64_file_header ||
+ is_elf64_executable_file f1.elf64_file_header)
+ in
+ let dyn =
+(List.filter (fun x ->
+ x.elf64_p_type = Uint32.of_string (Nat_big_num.to_string elf_pt_dynamic)
+ ) pht)
+ in
+ (match dyn with
+ | [] ->
+ if print_msg then
+ "\nThere is no dynamic section in this file."
+ else
+ ""
+ | [x] -> harness_string_of_elf64_dynamic_section' f1 x bs0 os_additional_ranges os proc os_print os_dyn proc_dyn
+ | _ -> "Multiple dynamic sections detected."
+ ))
+
+