| Compressed of (string * Virt_mem_mmap.addr) list * Virt_mem_mmap.addr
| Uncompressed of (string * Virt_mem_mmap.addr) list
-let find_kallsyms debug ({ domname = domname; mem = mem } as image) ksymmap =
+let find_kallsyms debug ({ domname = domname; mem = mem; ksyms = ksyms }
+ as kimage) =
let start_t = gettimeofday () in
(* Now try to find the /proc/kallsyms table. This is in an odd
* more useful than the basic list of exports.
*)
let ksym_addrs = List.filter_map (
- fun ksym -> try Some (Ksymmap.find ksym ksymmap) with Not_found -> None
+ fun ksym -> try Some (Ksymmap.find ksym ksyms) with Not_found -> None
) Virt_mem_ksyms.common_ksyms in
(* Search for those kernel addresses in the image. We're looking
(* Vote for the most popular symbol table candidate and
* enhance the function for looking up ksyms.
*)
- let ksymmap =
+ let ksyms, have_kallsyms =
let freqs = frequency kallsymtabs in
match freqs with
| [] ->
(* Can't find any kallsymtabs. *)
- None
+ ksyms, false
| (_, (_, _, _, Uncompressed names)) :: _ ->
- let rec loop ksymmap = function
+ let rec loop ksyms = function
| (name, value) :: names ->
- loop (Ksymmap.add name value ksymmap) names
- | [] -> ksymmap
+ loop (Ksymmap.add name value ksyms) names
+ | [] -> ksyms
in
- Some (loop ksymmap names)
+ loop ksyms names, true
| (_, (start_addr, num_entries, names_addr,
Compressed (compressed_names, markers_addr))) :: _ ->
Some (name, sym_value)
) compressed_names in
- let rec loop ksymmap = function
+ let rec loop ksyms = function
| (name, value) :: names ->
- loop (Ksymmap.add name value ksymmap) names
- | [] -> ksymmap
+ loop (Ksymmap.add name value ksyms) names
+ | [] -> ksyms
in
- Some (loop ksymmap names) in
+ loop ksyms names, true in
if debug then (
let end_t = gettimeofday () in
(end_t -. start_t)
);
- (image, ksymmap)
+ { kimage with ksyms = ksyms; have_kallsyms = have_kallsyms }