@@ -6,41 +6,43 @@ use super::mystd::borrow::ToOwned;
6
6
use super :: mystd:: env;
7
7
use super :: mystd:: ffi:: { CStr , OsStr } ;
8
8
use super :: mystd:: os:: unix:: prelude:: * ;
9
- use super :: { Library , LibrarySegment , OsString , Vec } ;
9
+ use super :: { parse_running_mmaps , Library , LibrarySegment , OsString , Vec } ;
10
10
use core:: slice;
11
11
12
12
struct CallbackData {
13
13
libs : Vec < Library > ,
14
- #[ cfg( target_os = "android" ) ]
15
- maps : Option < Vec < super :: parse_running_mmaps:: MapsEntry > > ,
14
+ maps : Option < Vec < parse_running_mmaps:: MapsEntry > > ,
16
15
}
17
16
pub ( super ) fn native_libraries ( ) -> Vec < Library > {
18
17
let mut cb_data = CallbackData {
19
18
libs : Vec :: new ( ) ,
20
- #[ cfg( target_os = "android" ) ]
21
- maps : super :: parse_running_mmaps:: parse_maps ( ) . ok ( ) ,
19
+ #[ cfg( not( target_os = "hurd" ) ) ]
20
+ maps : parse_running_mmaps:: parse_maps ( ) . ok ( ) ,
21
+ #[ cfg( target_os = "hurd" ) ]
22
+ maps : None ,
22
23
} ;
23
24
unsafe {
24
25
libc:: dl_iterate_phdr ( Some ( callback) , core:: ptr:: addr_of_mut!( cb_data) . cast ( ) ) ;
25
26
}
26
27
cb_data. libs
27
28
}
28
29
29
- fn infer_current_exe ( base_addr : usize ) -> OsString {
30
- cfg_if :: cfg_if! {
31
- if # [ cfg ( not ( target_os = "hurd" ) ) ] {
32
- if let Ok ( entries ) = super :: parse_running_mmaps :: parse_maps ( ) {
33
- let opt_path = entries
34
- . iter ( )
35
- . find ( |e| e . ip_matches ( base_addr ) && e . pathname ( ) . len ( ) > 0 )
36
- . map ( |e| e . pathname ( ) )
37
- . cloned ( ) ;
38
- if let Some ( path ) = opt_path {
39
- return path ;
40
- }
41
- }
30
+ fn infer_current_exe (
31
+ maps : & Option < Vec < parse_running_mmaps :: MapsEntry > > ,
32
+ base_addr : usize ,
33
+ ) -> OsString {
34
+ # [ cfg ( not ( target_os = "hurd" ) ) ]
35
+ if let Some ( entries ) = maps {
36
+ let opt_path = entries
37
+ . iter ( )
38
+ . find ( |e| e . ip_matches ( base_addr ) && e . pathname ( ) . len ( ) > 0 )
39
+ . map ( |e| e . pathname ( ) )
40
+ . cloned ( ) ;
41
+ if let Some ( path ) = opt_path {
42
+ return path ;
42
43
}
43
44
}
45
+
44
46
env:: current_exe ( ) . map ( |e| e. into ( ) ) . unwrap_or_default ( )
45
47
}
46
48
@@ -59,11 +61,7 @@ unsafe extern "C" fn callback(
59
61
let dlpi_phdr = unsafe { ( * info) . dlpi_phdr } ;
60
62
let dlpi_phnum = unsafe { ( * info) . dlpi_phnum } ;
61
63
// SAFETY: We assured this.
62
- let CallbackData {
63
- libs,
64
- #[ cfg( target_os = "android" ) ]
65
- maps,
66
- } = unsafe { & mut * data. cast :: < CallbackData > ( ) } ;
64
+ let CallbackData { libs, maps } = unsafe { & mut * data. cast :: < CallbackData > ( ) } ;
67
65
// most implementations give us the main program first
68
66
let is_main = libs. is_empty ( ) ;
69
67
// we may be statically linked, which means we are main and mostly one big blob of code
@@ -76,7 +74,7 @@ unsafe extern "C" fn callback(
76
74
// don't try to look up our name from /proc/self/maps, it'll get silly
77
75
env:: current_exe ( ) . unwrap_or_default ( ) . into_os_string ( )
78
76
} else if is_main && no_given_name {
79
- infer_current_exe ( dlpi_addr as usize )
77
+ infer_current_exe ( & maps , dlpi_addr as usize )
80
78
} else {
81
79
// this fallback works even if we are main, because some platforms give the name anyways
82
80
if dlpi_name. is_null ( ) {
0 commit comments