13 #ifndef __BINRELOC_C__
14 #define __BINRELOC_C__
18 #ifdef ENABLE_BINRELOC
19 #include <sys/types.h>
36 # define DIRSEP_C '\\'
50 #ifndef ENABLE_BINRELOC
55 char *path, *path2, *line, *result;
62 if (
sizeof (path) > SSIZE_MAX)
63 buf_size = SSIZE_MAX - 1;
65 buf_size = PATH_MAX - 1;
66 path = (
char *) malloc (buf_size);
73 path2 = (
char *) malloc (buf_size);
82 strncpy (path2,
"/proc/self/exe", buf_size - 1);
87 size = readlink (path2, path, buf_size - 1);
99 i = stat (path, &stat_buf);
107 if (!S_ISLNK (stat_buf.st_mode)) {
114 strncpy (path, path2, buf_size - 1);
121 buf_size = PATH_MAX + 128;
122 line = (
char *) realloc (path, buf_size);
131 f = fopen (
"/proc/self/maps",
"r");
140 result = fgets (line, (
int) buf_size, f);
141 if (result ==
NULL) {
150 buf_size = strlen (line);
159 if (line[buf_size - 1] == 10)
160 line[buf_size - 1] = 0;
166 if (strstr (line,
" r-xp ") ==
NULL || path ==
NULL) {
174 path = strdup (path);
189 #ifndef ENABLE_BINRELOC
192 return (
char *)
NULL;
194 #define SIZE PATH_MAX + 100
196 size_t address_string_len;
197 char *address_string, line[SIZE], *found;
200 return (
char *)
NULL;
202 f = fopen (
"/proc/self/maps",
"r");
204 return (
char *)
NULL;
206 address_string_len = 4;
207 address_string = (
char *) malloc (address_string_len);
208 found = (
char *)
NULL;
211 char *start_addr, *end_addr, *end_addr_end, *file;
212 void *start_addr_p, *end_addr_p;
215 if (fgets (line, SIZE, f) ==
NULL)
219 if (strstr (line,
" r-xp ") ==
NULL || strchr (line,
'/') ==
NULL)
224 end_addr = strchr (line,
'-');
225 file = strchr (line,
'/');
228 if (!(file > end_addr && end_addr !=
NULL && end_addr[0] ==
'-'))
233 end_addr_end = strchr (end_addr,
' ');
234 if (end_addr_end ==
NULL)
237 end_addr_end[0] =
'\0';
241 if (file[len - 1] ==
'\n')
242 file[len - 1] =
'\0';
246 if (len > 10 && strcmp (file + len - 10,
" (deleted)") == 0)
247 file[len - 10] =
'\0';
250 len = strlen (start_addr);
251 if (len != strlen (end_addr))
257 if (address_string_len < len + 3) {
258 address_string_len = len + 3;
259 address_string = (
char *) realloc (address_string, address_string_len);
262 memcpy (address_string,
"0x", 2);
263 memcpy (address_string + 2, start_addr, len);
264 address_string[2 + len] =
'\0';
265 sscanf (address_string,
"%p", &start_addr_p);
267 memcpy (address_string,
"0x", 2);
268 memcpy (address_string + 2, end_addr, len);
269 address_string[2 + len] =
'\0';
270 sscanf (address_string,
"%p", &end_addr_p);
273 if (symbol >= start_addr_p && symbol < end_addr_p) {
279 free (address_string);
283 return (
char *)
NULL;
285 return strdup (found);
290 #ifndef BINRELOC_RUNNING_DOXYGEN
292 #define NULL ((void *) 0)
354 if (exe == (
char *)
NULL) {
356 if (default_exe != (
const char *)
NULL)
357 return strdup (default_exe);
359 return (
char *)
NULL;
384 if (default_dir !=
NULL)
385 return strdup (default_dir);
412 if (exe == (
char *)
NULL) {
414 if (default_prefix != (
const char *)
NULL)
415 return strdup (default_prefix);
417 return (
char *)
NULL;
446 if (prefix == (
char *)
NULL) {
448 if (default_bin_dir != (
const char *)
NULL)
449 return strdup (default_bin_dir);
451 return (
char *)
NULL;
479 if (prefix == (
char *)
NULL) {
481 if (default_sbin_dir != (
const char *)
NULL)
482 return strdup (default_sbin_dir);
484 return (
char *)
NULL;
513 if (prefix == (
char *)
NULL) {
515 if (default_data_dir != (
const char *)
NULL)
516 return strdup (default_data_dir);
518 return (
char *)
NULL;
543 char *data_dir, *dir;
546 if (data_dir == (
char *)
NULL) {
548 if (default_locale_dir != (
const char *)
NULL)
549 return strdup (default_locale_dir);
551 return (
char *)
NULL;
579 if (prefix == (
char *)
NULL) {
581 if (default_lib_dir != (
const char *)
NULL)
582 return strdup (default_lib_dir);
584 return (
char *)
NULL;
612 if (prefix == (
char *)
NULL) {
614 if (default_libexec_dir != (
const char *)
NULL)
615 return strdup (default_libexec_dir);
617 return (
char *)
NULL;
645 if (prefix == (
char *)
NULL) {
647 if (default_etc_dir != (
const char *)
NULL)
648 return strdup (default_etc_dir);
650 return (
char *)
NULL;
680 len1 = strlen (str1);
681 len2 = strlen (str2);
683 result = (
char *) malloc (len1 + len2 + 1);
684 memcpy (result, str1, len1);
685 memcpy (result + len1, str2, len2);
686 result[len1 + len2] =
'\0';
700 if (len > 0 && dir[len - 1] !=
DIRSEP_C) {
717 char *result = (
char *)
NULL;
720 if (str == (
const char *)
NULL)
721 return (
char *)
NULL;
729 result = (
char *) malloc (len + 1);
730 memcpy (result, str, size);
753 if (path == (
const char *)
NULL)
754 return (
char *)
NULL;
757 if (end == (
const char *)
NULL)
760 while (end > path && *end ==
DIRSEP_C)
763 if (result[0] == 0) {