Index: Makefile.inc1 =================================================================== RCS file: /zork/cvs/src/Makefile.inc1,v retrieving revision 1.607 diff -u -r1.607 Makefile.inc1 --- Makefile.inc1 25 Jun 2008 21:33:28 -0000 1.607 +++ Makefile.inc1 24 Jul 2008 20:49:22 -0000 @@ -482,6 +482,8 @@ .for _t in obj depend all cd ${.CURDIR}/libexec/rtld-elf; \ PROG=ld-elf32.so.1 ${LIB32WMAKE} ${_t} + cd ${.CURDIR}/usr.bin/ldd; \ + PROG=ldd32 ${LIB32WMAKE} ${_t} .endfor distribute32 install32: @@ -501,6 +503,7 @@ cd ${.CURDIR}/secure/lib; ${LIB32IMAKE} ${.TARGET:S/32$//} .endif cd ${.CURDIR}/libexec/rtld-elf; PROG=ld-elf32.so.1 ${LIB32IMAKE} ${.TARGET:S/32$//} + cd ${.CURDIR}/usr.bin/ldd; PROG=ldd32 ${LIB32IMAKE} ${.TARGET:S/32$//} .endif Index: usr.bin/ldd/Makefile =================================================================== RCS file: /zork/cvs/src/usr.bin/ldd/Makefile,v retrieving revision 1.13 diff -u -r1.13 Makefile --- usr.bin/ldd/Makefile 29 Jun 2004 21:13:15 -0000 1.13 +++ usr.bin/ldd/Makefile 24 Jul 2008 21:22:41 -0000 @@ -1,6 +1,6 @@ # $FreeBSD: src/usr.bin/ldd/Makefile,v 1.13 2004/06/29 21:13:15 dwmalone Exp $ -PROG= ldd +PROG?= ldd SRCS= ldd.c .if ${MACHINE_ARCH} == "i386" SRCS+= sods.c Index: usr.bin/ldd/ldd.1 =================================================================== RCS file: /zork/cvs/src/usr.bin/ldd/ldd.1,v retrieving revision 1.27 diff -u -r1.27 ldd.1 --- usr.bin/ldd/ldd.1 3 Jul 2008 22:37:51 -0000 1.27 +++ usr.bin/ldd/ldd.1 24 Jul 2008 20:50:02 -0000 @@ -64,12 +64,6 @@ It will print a report of all ELF binaries in the current directory, which link against libc.so.6: .Dl "find . -type f | xargs -n1 file -F " " | grep ELF | cut -f1 -d' ' | xargs ldd -f '%A %o\en' | grep libc.so.6" -.Sh BUGS -On 64 bit architectures, dlopen() cannot open 32 bit dynamic libraries, -so -.Nm -will show the error -.Qq "unsupported file layout" . .Sh SEE ALSO .Xr ld 1 , .Xr nm 1 , Index: usr.bin/ldd/ldd.c =================================================================== RCS file: /zork/cvs/src/usr.bin/ldd/ldd.c,v retrieving revision 1.37 diff -u -r1.37 ldd.c --- usr.bin/ldd/ldd.c 21 Jul 2008 02:13:14 -0000 1.37 +++ usr.bin/ldd/ldd.c 24 Jul 2008 21:24:40 -0000 @@ -44,10 +44,17 @@ #include #include #include +#include #include #include "extern.h" +#ifdef COMPAT_32BIT +#define LD_ "LD_32_" +#else +#define LD_ "LD_" +#endif + /* * Elf32_xhdr structures can only be used if sys/elf32.h is included, so * check for the existence of one of the macros defined in sys/elf32.h. @@ -69,30 +76,60 @@ #define TYPE_ELF 2 /* Architecture default */ #if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED) #define TYPE_ELF32 3 /* Explicit 32 bits on architectures >32 bits */ -#endif -#define ENV_OBJECTS 0 -#define ENV_OBJECTS_FMT1 1 -#define ENV_OBJECTS_FMT2 2 -#define ENV_OBJECTS_PROGNAME 3 -#define ENV_OBJECTS_ALL 4 -#define ENV_LAST 5 - -const char *envdef[ENV_LAST] = { - "LD_TRACE_LOADED_OBJECTS", - "LD_TRACE_LOADED_OBJECTS_FMT1", - "LD_TRACE_LOADED_OBJECTS_FMT2", - "LD_TRACE_LOADED_OBJECTS_PROGNAME", - "LD_TRACE_LOADED_OBJECTS_ALL", -}; -#if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED) -const char *env32[ENV_LAST] = { - "LD_32_TRACE_LOADED_OBJECTS", - "LD_32_TRACE_LOADED_OBJECTS_FMT1", - "LD_32_TRACE_LOADED_OBJECTS_FMT2", - "LD_32_TRACE_LOADED_OBJECTS_PROGNAME", - "LD_32_TRACE_LOADED_OBJECTS_ALL", -}; +#define _PATH_LDD32 "/usr/bin/ldd32" + +static int +execldd32(char *file, char *fmt1, char *fmt2, int aflag, int vflag) +{ + char *argv[8]; + int i, rval, status; + + unsetenv(LD_ "TRACE_LOADED_OBJECTS"); + + rval = 0; + i = 0; + argv[i++] = strdup(_PATH_LDD32); + if (aflag) + argv[i++] = strdup("-a"); + if (vflag) + argv[i++] = strdup("-v"); + if (fmt1) { + argv[i++] = strdup("-f"); + argv[i++] = strdup(fmt1); + } + if (fmt2) { + argv[i++] = strdup("-f"); + argv[i++] = strdup(fmt2); + } + + argv[i++] = strdup(file); + argv[i++] = NULL; + + switch (fork()) { + case -1: + err(1, "fork"); + break; + case 0: + execv(_PATH_LDD32, argv); + warn("%s", _PATH_LDD32); + _exit(1); + break; + default: + if (wait(&status) <= 0) { + rval = 1; + } else if (WIFSIGNALED(status)) { + rval = 1; + } else if (WIFEXITED(status) && WEXITSTATUS(status)) { + rval = 1; + } + break; + } + while (i--) + free(argv[i]); + setenv(LD_ "TRACE_LOADED_OBJECTS", "yes", 1); + return (rval); +} #endif int @@ -147,7 +184,6 @@ rval = 0; for (; argc > 0; argc--, argv++) { int fd, status, is_shlib, rv, type; - const char **env; if ((fd = open(*argv, O_RDONLY, 0)) < 0) { warn("%s", *argv); @@ -164,12 +200,11 @@ switch (type) { case TYPE_ELF: case TYPE_AOUT: - env = envdef; break; #if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED) case TYPE_ELF32: - env = env32; - break; + rval |= execldd32(*argv, fmt1, fmt2, aflag, vflag); + continue; #endif case TYPE_UNKNOWN: default: @@ -181,15 +216,15 @@ } /* ld.so magic */ - setenv(env[ENV_OBJECTS], "yes", 1); + setenv(LD_ "TRACE_LOADED_OBJECTS", "yes", 1); if (fmt1 != NULL) - setenv(env[ENV_OBJECTS_FMT1], fmt1, 1); + setenv(LD_ "TRACE_LOADED_OBJECTS_FMT1", fmt1, 1); if (fmt2 != NULL) - setenv(env[ENV_OBJECTS_FMT2], fmt2, 1); + setenv(LD_ "TRACE_LOADED_OBJECTS_FMT2", fmt2, 1); - setenv(env[ENV_OBJECTS_PROGNAME], *argv, 1); + setenv(LD_ "TRACE_LOADED_OBJECTS_PROGNAME", *argv, 1); if (aflag) - setenv(env[ENV_OBJECTS_ALL], "1", 1); + setenv(LD_ "TRACE_LOADED_OBJECTS_ALL", "1", 1); else if (fmt1 == NULL && fmt2 == NULL) /* Default formats */ printf("%s:\n", *argv);