Page MenuHomeFreeBSD

D34716.id104384.diff
No OneTemporary

D34716.id104384.diff

diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -172,7 +172,7 @@
static int symlook_obj1_sysv(SymLook *, const Obj_Entry *);
static int symlook_obj1_gnu(SymLook *, const Obj_Entry *);
static void *tls_get_addr_slow(Elf_Addr **, int, size_t, bool) __noinline;
-static void trace_loaded_objects(Obj_Entry *);
+static void trace_loaded_objects(Obj_Entry *, bool);
static void unlink_object(Obj_Entry *);
static void unload_object(Obj_Entry *, RtldLockState *lockstate);
static void unref_dag(Obj_Entry *);
@@ -872,7 +872,7 @@
dump_auxv(aux_info);
if (ld_tracing) { /* We're done */
- trace_loaded_objects(obj_main);
+ trace_loaded_objects(obj_main, true);
exit(0);
}
@@ -3834,7 +3834,7 @@
lock_release(rtld_bind_lock, lockstate);
return (obj);
trace:
- trace_loaded_objects(obj);
+ trace_loaded_objects(obj, false);
if (lockstate == &mlockstate)
lock_release(rtld_bind_lock, lockstate);
exit(0);
@@ -4920,101 +4920,125 @@
}
static void
-trace_loaded_objects(Obj_Entry *obj)
+trace_calc_fmts(const char **main_local, const char **fmt1, const char **fmt2)
{
- const char *fmt1, *fmt2, *fmt, *main_local, *list_containers;
- int c;
+ *main_local = ld_get_env_var(LD_TRACE_LOADED_OBJECTS_PROGNAME);
+ if (*main_local == NULL)
+ *main_local = "";
- if ((main_local = ld_get_env_var(LD_TRACE_LOADED_OBJECTS_PROGNAME)) ==
- NULL)
- main_local = "";
+ *fmt1 = ld_get_env_var(LD_TRACE_LOADED_OBJECTS_FMT1);
+ if (*fmt1 == NULL)
+ *fmt1 = "\t%o => %p (%x)\n";
- if ((fmt1 = ld_get_env_var(LD_TRACE_LOADED_OBJECTS_FMT1)) == NULL)
- fmt1 = "\t%o => %p (%x)\n";
-
- if ((fmt2 = ld_get_env_var(LD_TRACE_LOADED_OBJECTS_FMT2)) == NULL)
- fmt2 = "\t%o (%x)\n";
-
- list_containers = ld_get_env_var(LD_TRACE_LOADED_OBJECTS_ALL);
-
- for (; obj != NULL; obj = TAILQ_NEXT(obj, next)) {
- Needed_Entry *needed;
- const char *name, *path;
- bool is_lib;
-
- if (obj->marker)
- continue;
- if (list_containers && obj->needed != NULL)
- rtld_printf("%s:\n", obj->path);
- for (needed = obj->needed; needed; needed = needed->next) {
- if (needed->obj != NULL) {
- if (needed->obj->traced && !list_containers)
- continue;
- needed->obj->traced = true;
- path = needed->obj->path;
- } else
- path = "not found";
+ *fmt2 = ld_get_env_var(LD_TRACE_LOADED_OBJECTS_FMT2);
+ if (*fmt2 == NULL)
+ *fmt2 = "\t%o (%x)\n";
+}
- name = obj->strtab + needed->name;
- is_lib = strncmp(name, "lib", 3) == 0; /* XXX - bogus */
+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 = is_lib ? fmt1 : fmt2;
- while ((c = *fmt++) != '\0') {
+ 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':
+ rtld_putchar(c);
continue;
- case 'n':
- rtld_putchar('\n');
- break;
- case 't':
- rtld_putchar('\t');
+ case '\\':
+ switch (c = *fmt) {
+ case '\0':
+ continue;
+ case 'n':
+ rtld_putchar('\n');
+ break;
+ case 't':
+ rtld_putchar('\t');
+ break;
+ }
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);
+ 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;
- }
- break;
}
++fmt;
- }
}
- }
+}
+
+static void
+trace_loaded_objects(Obj_Entry *obj, bool show_preload)
+{
+ const char *fmt1, *fmt2, *main_local, *list_containers;
+ const char *name, *path;
+ bool first_spurious;
+
+ trace_calc_fmts(&main_local, &fmt1, &fmt2);
+ list_containers = ld_get_env_var(LD_TRACE_LOADED_OBJECTS_ALL);
+
+ for (; obj != NULL; obj = TAILQ_NEXT(obj, next)) {
+ Needed_Entry *needed;
+
+ if (obj->marker)
+ continue;
+ if (list_containers && obj->needed != NULL)
+ rtld_printf("%s:\n", obj->path);
+ for (needed = obj->needed; needed; needed = needed->next) {
+ if (needed->obj != NULL) {
+ if (needed->obj->traced && !list_containers)
+ continue;
+ needed->obj->traced = true;
+ path = needed->obj->path;
+ } else
+ path = "not found";
+
+ name = obj->strtab + needed->name;
+ trace_print_obj(obj, name, path, main_local,
+ fmt1, fmt2);
+ }
+ }
+
+ if (show_preload) {
+ first_spurious = true;
+ TAILQ_FOREACH(obj, &obj_list, next) {
+ if (obj->marker || obj == obj_main || obj->traced)
+ continue;
+
+ if (first_spurious) {
+ rtld_printf("[preloaded]\n");
+ first_spurious = false;
+ }
+ Name_Entry *fname = STAILQ_FIRST(&obj->names);
+ name = fname == NULL ? "<unknown>" : fname->name;
+ trace_print_obj(obj, name, obj->path, main_local,
+ fmt1, fmt2);
+ }
+ }
}
/*

File Metadata

Mime Type
text/plain
Expires
Fri, Aug 28, 10:00 PM (4 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37485352
Default Alt Text
D34716.id104384.diff (5 KB)

Event Timeline