3
3
4
4
use crate :: { FfiResult , StatusCode , SymblibPointResolver } ;
5
5
use std:: ffi:: { c_char, CStr } ;
6
+ use std:: mem;
6
7
use std:: path:: Path ;
7
- use symblib:: symbconv:: PointResolver ;
8
+ use symblib:: symbconv:: { PointResolver , ResolvedSymbol , Result as SymconvResult } ;
8
9
use symblib:: { gosym:: GoRuntimeInfo , objfile} ;
9
10
10
11
pub struct SymblibGoRuntime {
11
- #[ allow( dead_code) ]
12
+ #[ allow( unused) ]
13
+ obj : Box < objfile:: File > ,
12
14
runtime : GoRuntimeInfo < ' static > ,
13
15
}
14
16
17
+ impl PointResolver for SymblibGoRuntime {
18
+ fn symbols_for_pc ( & self , pc : symblib:: VirtAddr ) -> SymconvResult < Vec < ResolvedSymbol > > {
19
+ self . runtime . symbols_for_pc ( pc)
20
+ }
21
+ }
22
+
15
23
#[ no_mangle]
16
24
pub unsafe extern "C" fn symblib_goruntime_new (
17
25
executable : * const c_char ,
@@ -32,12 +40,20 @@ unsafe fn goruntime_new_impl(
32
40
. map ( Path :: new)
33
41
. map_err ( |_| StatusCode :: BadUtf8 ) ?;
34
42
35
- let obj = Box :: leak ( Box :: new ( objfile:: File :: load ( executable) ?) ) ;
43
+ let obj = Box :: new ( objfile:: File :: load ( executable) ?) ;
36
44
let obj_reader = obj. parse ( ) ?;
37
45
let go_runtime = GoRuntimeInfo :: open ( & obj_reader) ?;
38
46
47
+ // Transmute away lifetime to allow for self-referential struct.
48
+ let go_runtime: GoRuntimeInfo < ' static > = mem:: transmute ( go_runtime) ;
49
+
50
+ let resolver = SymblibGoRuntime {
51
+ obj,
52
+ runtime : go_runtime,
53
+ } ;
54
+
39
55
let point_resolver = Box :: new ( SymblibPointResolver :: new (
40
- Box :: new ( go_runtime ) as Box < dyn PointResolver + Send >
56
+ Box :: new ( resolver ) as Box < dyn PointResolver + Send >
41
57
) ) ;
42
58
* runtime = Box :: into_raw ( point_resolver) ;
43
59
Ok ( ( ) )
0 commit comments