Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F168383500
D34716.id104384.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D34716.id104384.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D34716: rtld: trace preloaded objects
Attached
Detach File
Event Timeline
Log In to Comment