35#define NULL ((void *) 0)
38 #define br_return_val_if_fail(expr,val) if (!(expr)) {fprintf (stderr, "** BinReloc (%s): assertion %s failed\n", __PRETTY_FUNCTION__, #expr); return val;}
40 #define br_return_val_if_fail(expr, val) if (!(expr)) return val
50static char *br_last_value = (
char*)
NULL;
54br_free_last_value (
void)
77br_thread_local_store (
char *str)
79 static int initialized = 0;
84 atexit (br_free_last_value);
92 return (
const char *) str;
128br_locate (
void *symbol)
134 br_return_val_if_fail (symbol !=
NULL,
NULL);
136 f = fopen (
"/proc/self/maps",
"r");
142 unsigned long start, end;
144 if (!fgets (
line,
sizeof (
line), f))
149 sscanf (
line,
"%lx-%lx ", &start, &end);
150 if (symbol >= (
void *) start && symbol < (
void *) end)
156 path = strchr (
line,
'/');
159 tmp = strrchr (path,
'\n');
164 if (len > 10 && strcmp (path + len - 10,
" (deleted)") == 0)
166 tmp = path + len - 10;
171 return strdup (path);
194br_extract_prefix (
const char *path)
196 char *end, *tmp, *result;
198 br_return_val_if_fail (path != (
char*)
NULL, (
char*)
NULL);
200 if (!*path)
return strdup (
"/");
201 end = strrchr (path,
'/');
202 if (!end)
return strdup (path);
204 tmp = g_strndup ((
char *) path, end - path);
210 end = strrchr (tmp,
'/');
211 if (!end)
return tmp;
213 result = g_strndup (tmp, end - tmp);
219 result = strdup (
"/");
240br_locate_prefix (
void *symbol)
244 br_return_val_if_fail (symbol !=
NULL,
NULL);
246 path = br_locate (symbol);
247 if (!path)
return NULL;
249 prefix = br_extract_prefix (path);
270br_prepend_prefix (
void *symbol,
char *path)
274 br_return_val_if_fail (symbol !=
NULL,
NULL);
275 br_return_val_if_fail (path !=
NULL,
NULL);
277 tmp = br_locate_prefix (symbol);
278 if (!tmp)
return NULL;
280 if (strcmp (tmp,
"/") == 0)
281 newpath = strdup (path);
283 newpath = g_strconcat (tmp, path,
NULL);
int iso_c_forbids_an_empty_source_file
char * strstr(const char *str, const char *substr)