ldd: remove '[preloaded]' marker for the preloaded objects

for the default output.  For '-a' (per-object needed printout) the
[preloaded] banner is kept.

Instead, use special format2 for printing the preloaded objects (and
vdso), which does not include DT_NEEDED, since there is no object
needing the printed one.

In this way, the output is more compatible with glibc.

Example:
LD_PRELOAD=/lib/libthr.so.3 LD_TRACE_LOADED_OBJECTS=1 /libexec/ld-elf.so.1 /bin/ls
        libutil.so.9 => /lib/libutil.so.9 (0x801099000)
        libncursesw.so.9 => /lib/libncursesw.so.9 (0x8010b0000)
        libc.so.7 => /lib/libc.so.7 (0x801123000)
        [vdso] (0x7ffffffff000)
        /lib/libthr.so.3 (0x80106c000)
Note the absense of the part before and including '=>' for preloaded
libthr.so.3, and for vdso.

PR:	265750
Reviewed by:	jhb
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D36616
This commit is contained in:
Konstantin Belousov 2022-09-18 03:49:30 +03:00
parent 09ee0fc023
commit 2f72ee987d

View File

@ -4956,7 +4956,12 @@ trace_print_obj(Obj_Entry *obj, const char *name, const char *path,
const char *fmt;
int c;
fmt = strncmp(name, "lib", 3) == 0 ? fmt1 : fmt2; /* XXX bogus */
if (fmt1 == NULL)
fmt = fmt2;
else
/* XXX bogus */
fmt = strncmp(name, "lib", 3) == 0 ? fmt1 : fmt2;
while ((c = *fmt++) != '\0') {
switch (c) {
default:
@ -5038,19 +5043,23 @@ trace_loaded_objects(Obj_Entry *obj, bool show_preload)
}
if (show_preload) {
if (ld_get_env_var(LD_TRACE_LOADED_OBJECTS_FMT2) == NULL)
fmt2 = "\t%p (%x)\n";
first_spurious = true;
TAILQ_FOREACH(obj, &obj_list, next) {
if (obj->marker || obj == obj_main || obj->traced)
continue;
if (first_spurious) {
if (list_containers && 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);
NULL, fmt2);
}
}
}