1
1
use super :: mystd:: borrow:: ToOwned ;
2
2
use super :: mystd:: ffi:: { CStr , OsStr } ;
3
3
use super :: mystd:: os:: unix:: prelude:: * ;
4
+ use super :: { mmap, xcoff} ;
4
5
use super :: { Library , LibrarySegment , Vec } ;
5
6
7
+ const EXE_IMAGE_BASE : u64 = 0x100000000 ;
8
+
6
9
pub ( super ) fn native_libraries ( ) -> Vec < Library > {
7
10
let mut ret = Vec :: new ( ) ;
8
11
unsafe {
@@ -26,17 +29,25 @@ pub(super) fn native_libraries() -> Vec<Library> {
26
29
loop {
27
30
let text_base = ( * current) . ldinfo_textorg as usize ;
28
31
if text_base != 0 {
29
- let text_size = ( * current) . ldinfo_textsize as usize ;
30
32
let bytes = CStr :: from_ptr ( & ( * current) . ldinfo_filename [ 0 ] ) . to_bytes ( ) ;
31
- let name = OsStr :: from_bytes ( bytes) . to_owned ( ) ;
32
- ret. push ( Library {
33
- name,
34
- segments : vec ! [ LibrarySegment {
35
- stated_virtual_memory_address: text_base,
36
- len: text_size,
37
- } ] ,
38
- bias : 0 ,
39
- } ) ;
33
+ let mut name = OsStr :: from_bytes ( bytes) . to_owned ( ) ;
34
+ if text_base == EXE_IMAGE_BASE as usize {
35
+ if let Ok ( exe) = std:: env:: current_exe ( ) {
36
+ name = exe. into_os_string ( ) ;
37
+ }
38
+ }
39
+ if let Some ( map) = mmap ( name. as_ref ( ) ) {
40
+ if let Some ( image) = xcoff:: get_text_image ( & map) {
41
+ ret. push ( Library {
42
+ name,
43
+ segments : vec ! [ LibrarySegment {
44
+ stated_virtual_memory_address: image. base as usize ,
45
+ len: image. size,
46
+ } ] ,
47
+ bias : ( text_base + image. offset ) . wrapping_sub ( image. base as usize ) ,
48
+ } ) ;
49
+ }
50
+ } ;
40
51
}
41
52
if ( * current) . ldinfo_next == 0 {
42
53
break ;
0 commit comments