53#ifndef ENABLE_BINRELOC
58 char *path, *path2, *line, *result;
65 if (
sizeof(path) > SSIZE_MAX)
66 buf_size = SSIZE_MAX - 1;
68 buf_size = PATH_MAX - 1;
69 path = (
char *) malloc(buf_size);
76 path2 = (
char *) malloc(buf_size);
85 strncpy(path2,
"/proc/self/exe", buf_size - 1);
90 size = readlink(path2, path, buf_size - 1);
102 i = stat(path, &stat_buf);
110 if (!S_ISLNK(stat_buf.st_mode)) {
117 strncpy(path, path2, buf_size - 1);
124 buf_size = PATH_MAX + 128;
125 line = (
char *) realloc(path, buf_size);
134 f = fopen(
"/proc/self/maps",
"r");
143 result = fgets(line, (
int) buf_size, f);
144 if (result ==
NULL) {
153 buf_size = strlen(line);
162 if (line[buf_size - 1] == 10)
163 line[buf_size - 1] = 0;
169 if (strstr(line,
" r-xp ") ==
NULL || path ==
NULL) {
192#ifndef ENABLE_BINRELOC
195 return (
char *)
NULL;
197#define SIZE PATH_MAX + 100
199 size_t address_string_len;
200 char *address_string, line[SIZE], *found;
203 return (
char *)
NULL;
205 f = fopen(
"/proc/self/maps",
"r");
207 return (
char *)
NULL;
209 address_string_len = 4;
210 address_string = (
char *) malloc(address_string_len);
211 found = (
char *)
NULL;
214 char *start_addr, *end_addr, *end_addr_end, *file;
215 void *start_addr_p, *end_addr_p;
218 if (fgets(line, SIZE, f) ==
NULL)
222 if (strstr(line,
" r-xp ") ==
NULL || strchr(line,
'/') ==
NULL)
227 end_addr = strchr(line,
'-');
228 file = strchr(line,
'/');
231 if (!(file > end_addr && end_addr !=
NULL && end_addr[0] ==
'-'))
236 end_addr_end = strchr(end_addr,
' ');
237 if (end_addr_end ==
NULL)
240 end_addr_end[0] =
'\0';
244 if (file[len - 1] ==
'\n')
245 file[len - 1] =
'\0';
249 if (len > 10 && strcmp(file + len - 10,
" (deleted)") == 0)
250 file[len - 10] =
'\0';
253 len = strlen(start_addr);
254 if (len != strlen(end_addr))
260 if (address_string_len < len + 3) {
261 char *tmp_address_string;
263 address_string_len = len + 3;
264 tmp_address_string = (
char *) realloc(address_string, address_string_len);
265 if (tmp_address_string==
NULL)
266 free(address_string);
267 address_string = tmp_address_string;
270 memcpy(address_string,
"0x", 2);
271 memcpy(address_string + 2, start_addr, len);
272 address_string[2 + len] =
'\0';
273 sscanf(address_string,
"%p", &start_addr_p);
275 memcpy(address_string,
"0x", 2);
276 memcpy(address_string + 2, end_addr, len);
277 address_string[2 + len] =
'\0';
278 sscanf(address_string,
"%p", &end_addr_p);
281 if (symbol >= start_addr_p && symbol < end_addr_p) {
287 free(address_string);
291 return (
char *)
NULL;
293 return strdup(found);