aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/ldd/Makefile1
-rw-r--r--usr.bin/ldd/ldd.c12
2 files changed, 12 insertions, 1 deletions
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);
}