56 lines
1.6 KiB
OCaml
56 lines
1.6 KiB
OCaml
|
(** Entry point file for elf_arrows *)
|
||
|
|
||
|
exception NotElf;;
|
||
|
exception NoDwarf;;
|
||
|
exception NoDwarfStatic;;
|
||
|
|
||
|
let (>>=) = Error.bind
|
||
|
|
||
|
let make_pp linksem_pp =
|
||
|
(fun fmt arg ->
|
||
|
linksem_pp arg
|
||
|
|> Format.fprintf fmt "%s")
|
||
|
|
||
|
type elf_path = string
|
||
|
type elf_handle = ElfHandle of elf_path * Elf_file.elf_file * Dwarf.dwarf_static
|
||
|
|
||
|
(** Open an ELF file and loads its dwarf_static infos. *)
|
||
|
let open_elf elf_path =
|
||
|
|
||
|
(Byte_sequence.acquire elf_path >>= fun elf_bs -> (
|
||
|
match Elf_file.read_elf64_file elf_bs with
|
||
|
| Error.Success elf64 -> Error.Success (Elf_file.ELF_File_64 elf64)
|
||
|
| Error.Fail _ -> (match Elf_file.read_elf32_file elf_bs with
|
||
|
| Error.Success elf32 -> Error.Success (Elf_file.ELF_File_32 elf32)
|
||
|
| Error.Fail _ -> raise NotElf)
|
||
|
))
|
||
|
>>= fun elf_file -> (
|
||
|
let static_info = (match Dwarf.extract_dwarf_static elf_file with
|
||
|
| Some static_info -> static_info
|
||
|
| None -> raise NoDwarfStatic) in
|
||
|
Error.Success (ElfHandle (elf_path, elf_file, static_info)))
|
||
|
|
||
|
|
||
|
let elf_files = ref []
|
||
|
let speclist = []
|
||
|
let parse_anon_arg arg =
|
||
|
elf_files := arg :: (!elf_files)
|
||
|
|
||
|
let _ =
|
||
|
Arg.parse speclist parse_anon_arg "./test ELF_FILE" ;
|
||
|
let elf_handles = List.rev @@
|
||
|
List.map (fun path -> match open_elf path with
|
||
|
| Error.Success handle -> handle
|
||
|
| Error.Fail msg ->
|
||
|
raise (Failure ("Could not open " ^ path ^ ": " ^ msg)))
|
||
|
!elf_files
|
||
|
in
|
||
|
|
||
|
List.iter (fun (ElfHandle(path, _, static_info)) ->
|
||
|
let line_info = static_info.ds_evaluated_line_info in
|
||
|
Format.eprintf "Line infos <%s>:@. %a@."
|
||
|
path
|
||
|
(make_pp Dwarf.pp_evaluated_line_info)
|
||
|
line_info ;
|
||
|
) elf_handles
|