Skip to content

Commit 329f908

Browse files
committed
- Improved way to detect program base address
1 parent b6cd5d0 commit 329f908

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

resolv.c

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
resolv_info r_info;
2020

21-
static int _map_region(const char *line)
21+
static int _map_region(const char *prog, const char *line)
2222
{
2323
uintptr_t start, end;
2424
char perms[5], fname[PATH_MAX] = {0};
@@ -42,13 +42,13 @@ static int _map_region(const char *line)
4242

4343
segments[n].saddr = start;
4444
segments[n].eaddr = end;
45-
segments[n].is_dynamic = 0;
45+
segments[n].is_dynamic = 1;
4646

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;
5252
}
5353

5454
memcpy(segments[n].fname, fname, sizeof(fname));
@@ -62,7 +62,7 @@ static int _map_region(const char *line)
6262

6363
static int _map_segments()
6464
{
65-
char fname[PATH_MAX], *line = NULL;
65+
char fname[PATH_MAX], lname[PATH_MAX], *line = NULL;
6666
FILE *fp;
6767
size_t size;
6868

@@ -72,15 +72,27 @@ static int _map_segments()
7272
r_info.num_segments = 0;
7373
}
7474

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+
7586
snprintf(fname, sizeof(fname), "/proc/%d/maps", tracee.pid);
7687

7788
if ((fp = fopen(fname, "r")) == NULL) {
7889
return 0;
7990
}
8091

8192
while (getline(&line, &size, fp) != -1) {
82-
_map_region(line);
93+
_map_region(lname, line);
8394
}
95+
8496
free(line);
8597
fclose(fp);
8698

@@ -109,7 +121,7 @@ void resolv_startup()
109121
return;
110122
}
111123

112-
elfsym_startup(r_info.segments[0].saddr);
124+
elfsym_startup(r_info.baddr);
113125
}
114126

115127
void resolv_shutdown()

resolv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ typedef struct {
2626
} resolv_segment;
2727

2828
typedef struct {
29+
uintptr_t baddr; /* Base address of executable */
2930
resolv_segment *segments; /* Segments mapped to the process */
3031
unsigned int num_segments; /* Number of segments */
3132
} resolv_info;

0 commit comments

Comments
 (0)