diff options
Diffstat (limited to 'src/elf_model/elf_string_table.ml')
| -rw-r--r-- | src/elf_model/elf_string_table.ml | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/elf_model/elf_string_table.ml b/src/elf_model/elf_string_table.ml new file mode 100644 index 00000000..0a211385 --- /dev/null +++ b/src/elf_model/elf_string_table.ml @@ -0,0 +1,75 @@ +(*Generated by Lem from elf_string_table.lem.*) +open Elf_header +open Elf_section_header +open Elf_types + +open Bitstring +open Error +open Missing_pervasives + +open Lem_basic_classes +open Lem_list +open Lem_maybe +open Lem_num +open Lem_string +open Show + +let get_strings_of_string_table bs = +(let strings = (Bitstring.string_of_bitstring bs) in + Ml_bindings.split_string_on_char strings '\000') + +let read_elf32_string_table hdr sections bs : ( string list) error = +((match sections with + | None -> return [] + | Some sections -> + let idx = (Int64.to_int hdr.elf32_shstrndx) in + let string_table = (Lem_list.list_index sections idx) in + (match string_table with + | None -> Fail "read_elf32_string_table: string table index too large" + | Some string_table -> + let offset = (Int64.to_int string_table.elf32_sh_offset) in + let size = (Int64.to_int string_table.elf32_sh_size) in + let (_, initial) = (Utility.partition_bitstring (offset * 8) bs) in + let (relevant, _) = (Utility.partition_bitstring (size * 8) initial) in + return (get_strings_of_string_table relevant) + ) + )) + +let rec read_elf32_string_tables' offset_sizes (bs : Bitstring.bitstring) : ( string list) list = +((match offset_sizes with + | [] -> [] + | x::xs -> + let (offset, size) = x in + let (_, relevant) = (Utility.partition_bitstring offset bs) in + let (cut, _) = (Utility.partition_bitstring size relevant) in + let strings = (get_strings_of_string_table cut) in + let tail = (read_elf32_string_tables' xs bs) in + strings::tail + )) + +let read_elf32_string_tables sections bs : ( string list) list = +((match sections with + | None -> [] + | Some sections -> + let offsets_sizes = (List.concat (List.map (fun sect -> + if Int64.to_int sect.elf32_sh_type = sht_strtab then + let offset = ((Int64.to_int sect.elf32_sh_offset) * 8) in + let size = +(let _ = (print_endline ("YYY size: " ^ natShow (Int64.to_int sect.elf32_sh_size * 8))) in + Int64.to_int sect.elf32_sh_size * 8) + in + [(offset, size)] + else + [] + ) sections)) + in + read_elf32_string_tables' offsets_sizes bs + )) + +let string_of_elf32_string_table tbl = +("String table contents:" ^ ("\n\t" ^ +(List.fold_right (^) tbl "" ^ "\n\n"))) + +let string_of_elf32_dynamic_string_table tbl = +("Dynamic string table contents:" ^ ("\n\t" ^ +(List.fold_right (^) tbl "" ^ "\n\n"))) |
