summaryrefslogtreecommitdiff
path: root/src/elf_loader.ml
diff options
context:
space:
mode:
authorPrashanth Mundkur2019-02-27 19:03:27 -0800
committerPrashanth Mundkur2019-02-27 19:03:32 -0800
commit9fd08144367f0b3a08bd5fd3e973ede900a9c72d (patch)
tree911b71e2282d9982e42b610d564ab0cc0df04cbb /src/elf_loader.ml
parentb118c78ba85320ef2d6632bc2a6ee4f0907e5d23 (diff)
Provide more access to the ELF symbols in the OCaml ELF-loader.
Diffstat (limited to 'src/elf_loader.ml')
-rw-r--r--src/elf_loader.ml13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/elf_loader.ml b/src/elf_loader.ml
index 2f63087f..d6016c8b 100644
--- a/src/elf_loader.ml
+++ b/src/elf_loader.ml
@@ -47,9 +47,10 @@ let opt_elf_threads = ref 1
let opt_elf_entry = ref Big_int.zero
let opt_elf_tohost = ref Big_int.zero
-(* the type of elf last loaded *)
+(* the type of elf last loaded, and its symbol map *)
type elf_class = ELF_Class_64 | ELF_Class_32
let opt_elf_class = ref ELF_Class_64 (* default *)
+let opt_symbol_map = ref ([] : Elf_file.global_symbol_init_info)
type word8 = int
@@ -144,6 +145,7 @@ let load_segment ?writer:(writer=write_sail_lib) bs paddr base offset size memsz
let load_elf ?writer:(writer=write_sail_lib) name =
let segments, e_entry, symbol_map = read name in
opt_elf_entry := e_entry;
+ opt_symbol_map := symbol_map;
(if List.mem_assoc "tohost" symbol_map then
let (_, _, tohost_addr, _, _) = List.assoc "tohost" symbol_map in
opt_elf_tohost := tohost_addr);
@@ -181,3 +183,12 @@ let elf_entry () = !opt_elf_entry
let elf_tohost () = !opt_elf_tohost
(* Used to check last loaded elf class. *)
let elf_class () = !opt_elf_class
+(* Lookup the address for a symbol *)
+let elf_symbol symbol =
+ if List.mem_assoc symbol !opt_symbol_map then
+ let (_, _, addr, _, _) = List.assoc symbol !opt_symbol_map in
+ Some addr
+ else None
+(* Get all symbols *)
+let elf_symbols () =
+ !opt_symbol_map