18
18
19
19
resolv_info r_info ;
20
20
21
- static int _map_region (const char * line )
21
+ static int _map_region (const char * prog , const char * line )
22
22
{
23
23
uintptr_t start , end ;
24
24
char perms [5 ], fname [PATH_MAX ] = {0 };
@@ -42,13 +42,13 @@ static int _map_region(const char *line)
42
42
43
43
segments [n ].saddr = start ;
44
44
segments [n ].eaddr = end ;
45
- segments [n ].is_dynamic = 0 ;
45
+ segments [n ].is_dynamic = 1 ;
46
46
47
- if (fname [ 0 ] != '\0'
48
- && ( strstr ( fname , "[vdso]" ) != NULL
49
- || strstr ( fname , "[vsyscall]" ) != NULL
50
- || strstr ( fname , ".so" ) != NULL )) {
51
- segments [n ].is_dynamic = 1 ;
47
+ if (memcmp ( fname , prog , strlen ( prog ) + 1 ) == 0 ) {
48
+ if ( r_info . baddr == 0 ) {
49
+ r_info . baddr = start ;
50
+ }
51
+ segments [n ].is_dynamic = 0 ;
52
52
}
53
53
54
54
memcpy (segments [n ].fname , fname , sizeof (fname ));
@@ -62,7 +62,7 @@ static int _map_region(const char *line)
62
62
63
63
static int _map_segments ()
64
64
{
65
- char fname [PATH_MAX ], * line = NULL ;
65
+ char fname [PATH_MAX ], lname [ PATH_MAX ], * line = NULL ;
66
66
FILE * fp ;
67
67
size_t size ;
68
68
@@ -72,15 +72,27 @@ static int _map_segments()
72
72
r_info .num_segments = 0 ;
73
73
}
74
74
75
+ if (tracee .prog ) {
76
+ if (realpath (tracee .prog , lname ) == NULL ) {
77
+ return 0 ;
78
+ }
79
+ } else {
80
+ snprintf (fname , sizeof (fname ), "/proc/%d/exe" , tracee .pid );
81
+ if (readlink (fname , lname , sizeof (lname )) != -1 ) {
82
+ return 0 ;
83
+ }
84
+ }
85
+
75
86
snprintf (fname , sizeof (fname ), "/proc/%d/maps" , tracee .pid );
76
87
77
88
if ((fp = fopen (fname , "r" )) == NULL ) {
78
89
return 0 ;
79
90
}
80
91
81
92
while (getline (& line , & size , fp ) != -1 ) {
82
- _map_region (line );
93
+ _map_region (lname , line );
83
94
}
95
+
84
96
free (line );
85
97
fclose (fp );
86
98
@@ -109,7 +121,7 @@ void resolv_startup()
109
121
return ;
110
122
}
111
123
112
- elfsym_startup (r_info .segments [ 0 ]. saddr );
124
+ elfsym_startup (r_info .baddr );
113
125
}
114
126
115
127
void resolv_shutdown ()
0 commit comments