git: 7a3d7b9efc33 - stable/13 - ldd: do not use dlopen(RTLD_TRACE) for dso when format is specified

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Thu, 28 Oct 2021 00:36:29 UTC
The branch stable/13 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=7a3d7b9efc3373e439bccf234fd4fadd2af9a75f

commit 7a3d7b9efc3373e439bccf234fd4fadd2af9a75f
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-10-11 22:35:56 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2021-10-28 00:35:54 +0000

    ldd: do not use dlopen(RTLD_TRACE) for dso when format is specified
    
    PR:     259069
    
    (cherry picked from commit 2c7a6dad4de17c357eb91c723bad860c6512a598)
---
 usr.bin/ldd/Makefile |  1 +
 usr.bin/ldd/ldd.c    | 12 +++++++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/usr.bin/ldd/Makefile b/usr.bin/ldd/Makefile
index 78e551d80a33..1a671bc9f402 100644
--- a/usr.bin/ldd/Makefile
+++ b/usr.bin/ldd/Makefile
@@ -3,6 +3,7 @@
 PROG?=		ldd
 SRCS=		ldd.c
 
+CFLAGS+=	-I${SRCTOP}/libexec/rtld-elf
 LIBADD=		elf
 
 .include <bsd.prog.mk>
diff --git a/usr.bin/ldd/ldd.c b/usr.bin/ldd/ldd.c
index ee3f2070598d..492e29dff211 100644
--- a/usr.bin/ldd/ldd.c
+++ b/usr.bin/ldd/ldd.c
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
 #include <fcntl.h>
 #include <gelf.h>
 #include <libelf.h>
+#include <rtld_paths.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -134,6 +135,7 @@ int
 main(int argc, char *argv[])
 {
 	char *fmt1, *fmt2;
+	const char *rtld;
 	int aflag, c, fd, rval, status, is_shlib, rv, type;
 
 	aflag = 0;
@@ -234,9 +236,17 @@ main(int argc, char *argv[])
 			if (is_shlib == 0) {
 				execl(*argv, *argv, (char *)NULL);
 				warn("%s", *argv);
-			} else {
+			} else if (fmt1 == NULL && fmt2 == NULL) {
 				dlopen(*argv, RTLD_TRACE);
 				warnx("%s: %s", *argv, dlerror());
+			} else {
+				rtld = _PATH_RTLD;
+#if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED)
+				if (type == TYPE_ELF32)
+					rtld = _COMPAT32_PATH_RTLD;
+#endif
+				execl(rtld, rtld, "-d", "--",
+				    *argv, (char *)NULL);
 			}
 			_exit(1);
 		}