rtld: extract printer for a single traced object into a helper
Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D34716
This commit is contained in:
parent
c25f36f630
commit
24d0c9c1f5
@ -4935,11 +4935,66 @@ trace_calc_fmts(const char **main_local, const char **fmt1, const char **fmt2)
|
|||||||
*fmt2 = "\t%o (%x)\n";
|
*fmt2 = "\t%o (%x)\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
trace_print_obj(Obj_Entry *obj, const char *name, const char *path,
|
||||||
|
const char *main_local, const char *fmt1, const char *fmt2)
|
||||||
|
{
|
||||||
|
const char *fmt;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
fmt = strncmp(name, "lib", 3) == 0 ? fmt1 : fmt2; /* XXX bogus */
|
||||||
|
while ((c = *fmt++) != '\0') {
|
||||||
|
switch (c) {
|
||||||
|
default:
|
||||||
|
rtld_putchar(c);
|
||||||
|
continue;
|
||||||
|
case '\\':
|
||||||
|
switch (c = *fmt) {
|
||||||
|
case '\0':
|
||||||
|
continue;
|
||||||
|
case 'n':
|
||||||
|
rtld_putchar('\n');
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
rtld_putchar('\t');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '%':
|
||||||
|
switch (c = *fmt) {
|
||||||
|
case '\0':
|
||||||
|
continue;
|
||||||
|
case '%':
|
||||||
|
default:
|
||||||
|
rtld_putchar(c);
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
rtld_putstr(main_local);
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
rtld_putstr(obj_main->path);
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
rtld_putstr(name);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
rtld_putstr(path);
|
||||||
|
break;
|
||||||
|
case 'x':
|
||||||
|
rtld_printf("%p", obj != NULL ?
|
||||||
|
obj->mapbase : NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++fmt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
trace_loaded_objects(Obj_Entry *obj)
|
trace_loaded_objects(Obj_Entry *obj)
|
||||||
{
|
{
|
||||||
const char *fmt1, *fmt2, *fmt, *main_local, *list_containers;
|
const char *fmt1, *fmt2, *main_local, *list_containers;
|
||||||
int c;
|
|
||||||
|
|
||||||
trace_calc_fmts(&main_local, &fmt1, &fmt2);
|
trace_calc_fmts(&main_local, &fmt1, &fmt2);
|
||||||
list_containers = ld_get_env_var(LD_TRACE_LOADED_OBJECTS_ALL);
|
list_containers = ld_get_env_var(LD_TRACE_LOADED_OBJECTS_ALL);
|
||||||
@ -4947,7 +5002,6 @@ trace_loaded_objects(Obj_Entry *obj)
|
|||||||
for (; obj != NULL; obj = TAILQ_NEXT(obj, next)) {
|
for (; obj != NULL; obj = TAILQ_NEXT(obj, next)) {
|
||||||
Needed_Entry *needed;
|
Needed_Entry *needed;
|
||||||
const char *name, *path;
|
const char *name, *path;
|
||||||
bool is_lib;
|
|
||||||
|
|
||||||
if (obj->marker)
|
if (obj->marker)
|
||||||
continue;
|
continue;
|
||||||
@ -4963,63 +5017,7 @@ trace_loaded_objects(Obj_Entry *obj)
|
|||||||
path = "not found";
|
path = "not found";
|
||||||
|
|
||||||
name = obj->strtab + needed->name;
|
name = obj->strtab + needed->name;
|
||||||
is_lib = strncmp(name, "lib", 3) == 0; /* XXX - bogus */
|
trace_print_obj(obj, name, path, main_local, fmt1, fmt2);
|
||||||
|
|
||||||
fmt = is_lib ? fmt1 : fmt2;
|
|
||||||
while ((c = *fmt++) != '\0') {
|
|
||||||
switch (c) {
|
|
||||||
default:
|
|
||||||
rtld_putchar(c);
|
|
||||||
continue;
|
|
||||||
case '\\':
|
|
||||||
switch (c = *fmt) {
|
|
||||||
case '\0':
|
|
||||||
continue;
|
|
||||||
case 'n':
|
|
||||||
rtld_putchar('\n');
|
|
||||||
break;
|
|
||||||
case 't':
|
|
||||||
rtld_putchar('\t');
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case '%':
|
|
||||||
switch (c = *fmt) {
|
|
||||||
case '\0':
|
|
||||||
continue;
|
|
||||||
case '%':
|
|
||||||
default:
|
|
||||||
rtld_putchar(c);
|
|
||||||
break;
|
|
||||||
case 'A':
|
|
||||||
rtld_putstr(main_local);
|
|
||||||
break;
|
|
||||||
case 'a':
|
|
||||||
rtld_putstr(obj_main->path);
|
|
||||||
break;
|
|
||||||
case 'o':
|
|
||||||
rtld_putstr(name);
|
|
||||||
break;
|
|
||||||
#if 0
|
|
||||||
case 'm':
|
|
||||||
rtld_printf("%d", sodp->sod_major);
|
|
||||||
break;
|
|
||||||
case 'n':
|
|
||||||
rtld_printf("%d", sodp->sod_minor);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case 'p':
|
|
||||||
rtld_putstr(path);
|
|
||||||
break;
|
|
||||||
case 'x':
|
|
||||||
rtld_printf("%p", needed->obj ? needed->obj->mapbase :
|
|
||||||
0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
++fmt;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user