Module Name: src Committed By: matt Date: Sun Jul 8 00:53:45 UTC 2012
Modified Files: src/usr.bin/ldd: ldd.c ldd.h ldd_elfxx.c Log Message: Make sure stuff using Obj_Entry is compiled correctly for ELF32 or ELF64. To generate a diff of this commit: cvs rdiff -u -r1.19 -r1.20 src/usr.bin/ldd/ldd.c cvs rdiff -u -r1.6 -r1.7 src/usr.bin/ldd/ldd.h cvs rdiff -u -r1.5 -r1.6 src/usr.bin/ldd/ldd_elfxx.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/ldd/ldd.c diff -u src/usr.bin/ldd/ldd.c:1.19 src/usr.bin/ldd/ldd.c:1.20 --- src/usr.bin/ldd/ldd.c:1.19 Tue May 24 12:27:29 2011 +++ src/usr.bin/ldd/ldd.c Sun Jul 8 00:53:44 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: ldd.c,v 1.19 2011/05/24 12:27:29 joerg Exp $ */ +/* $NetBSD: ldd.c,v 1.20 2012/07/08 00:53:44 matt Exp $ */ /*- * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: ldd.c,v 1.19 2011/05/24 12:27:29 joerg Exp $"); +__RCSID("$NetBSD: ldd.c,v 1.20 2012/07/08 00:53:44 matt Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -89,6 +89,10 @@ __RCSID("$NetBSD: ldd.c,v 1.19 2011/05/2 */ static char *error_message; /* Message for dlopen(), or NULL */ bool _rtld_trust; /* False for setuid and setgid programs */ +/* + * This may be ELF64 or ELF32 but since they are used opaquely it doesn't + * really matter. + */ Obj_Entry *_rtld_objlist; /* Head of linked list of shared objects */ Obj_Entry **_rtld_objtail = &_rtld_objlist; /* Link field of last object in list */ @@ -200,111 +204,6 @@ dlerror() } void -fmtprint(const char *libname, Obj_Entry *obj, const char *fmt1, - const char *fmt2) -{ - const char *libpath = obj ? obj->path : "not found"; - char libnamebuf[200]; - char *libmajor = NULL; - const char *fmt; - char *cp; - int c; - - if (strncmp(libname, "lib", 3) == 0 && - (cp = strstr(libname, ".so")) != NULL) { - size_t i = cp - (libname + 3); - - if (i >= sizeof(libnamebuf)) - i = sizeof(libnamebuf) - 1; - (void)memcpy(libnamebuf, libname + 3, i); - libnamebuf[i] = '\0'; - if (cp[3] && isdigit((unsigned char)cp[4])) - libmajor = &cp[4]; - libname = libnamebuf; - } - - if (fmt1 == NULL) - fmt1 = libmajor != NULL ? - "\t-l%o.%m => %p\n" : - "\t-l%o => %p\n"; - if (fmt2 == NULL) - fmt2 = "\t%o => %p\n"; - - fmt = libname == libnamebuf ? fmt1 : fmt2; - while ((c = *fmt++) != '\0') { - switch (c) { - default: - putchar(c); - continue; - case '\\': - switch (c = *fmt) { - case '\0': - continue; - case 'n': - putchar('\n'); - break; - case 't': - putchar('\t'); - break; - } - break; - case '%': - switch (c = *fmt) { - case '\0': - continue; - case '%': - default: - putchar(c); - break; - case 'A': - printf("%s", main_local); - break; - case 'a': - printf("%s", main_progname); - break; - case 'o': - printf("%s", libname); - break; - case 'm': - printf("%s", libmajor); - break; - case 'n': - /* XXX: not supported for elf */ - break; - case 'p': - printf("%s", libpath); - break; - case 'x': - printf("%p", obj ? obj->mapbase : 0); - break; - } - break; - } - ++fmt; - } -} - -void -print_needed(Obj_Entry *obj, const char *fmt1, const char *fmt2) -{ - const Needed_Entry *needed; - - for (needed = obj->needed; needed != NULL; needed = needed->next) { - const char *libname = obj->strtab + needed->name; - - if (needed->obj != NULL) { - if (!needed->obj->printed) { - fmtprint(libname, needed->obj, fmt1, fmt2); - needed->obj->printed = 1; - print_needed(needed->obj, fmt1, fmt2); - } - } else { - fmtprint(libname, needed->obj, fmt1, fmt2); - } - } -} - -void _rtld_die(void) { const char *msg = dlerror(); Index: src/usr.bin/ldd/ldd.h diff -u src/usr.bin/ldd/ldd.h:1.6 src/usr.bin/ldd/ldd.h:1.7 --- src/usr.bin/ldd/ldd.h:1.6 Tue Dec 15 04:06:43 2009 +++ src/usr.bin/ldd/ldd.h Sun Jul 8 00:53:44 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: ldd.h,v 1.6 2009/12/15 04:06:43 mrg Exp $ */ +/* $NetBSD: ldd.h,v 1.7 2012/07/08 00:53:44 matt Exp $ */ /* * Copyright (c) 2008 Matthew R. Green @@ -43,8 +43,5 @@ int elf64_ldd(int, char *, const char *, #define elf_ldd elf32_ldd #endif -void fmtprint(const char *, Obj_Entry *, const char *, const char *); -void print_needed(Obj_Entry *, const char *, const char *); - extern char *main_local; extern char *main_progname; Index: src/usr.bin/ldd/ldd_elfxx.c diff -u src/usr.bin/ldd/ldd_elfxx.c:1.5 src/usr.bin/ldd/ldd_elfxx.c:1.6 --- src/usr.bin/ldd/ldd_elfxx.c:1.5 Thu Jun 30 20:09:41 2011 +++ src/usr.bin/ldd/ldd_elfxx.c Sun Jul 8 00:53:44 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: ldd_elfxx.c,v 1.5 2011/06/30 20:09:41 wiz Exp $ */ +/* $NetBSD: ldd_elfxx.c,v 1.6 2012/07/08 00:53:44 matt Exp $ */ /*- * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: ldd_elfxx.c,v 1.5 2011/06/30 20:09:41 wiz Exp $"); +__RCSID("$NetBSD: ldd_elfxx.c,v 1.6 2012/07/08 00:53:44 matt Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -84,6 +84,9 @@ __RCSID("$NetBSD: ldd_elfxx.c,v 1.5 2011 #include "rtld.h" #include "ldd.h" +static void print_needed(Obj_Entry *, const char *, const char *); +static void fmtprint(const char *, Obj_Entry *, const char *, const char *); + /* * elfxx_ldd() - bit-size independent ELF ldd implementation. * returns 0 on success and -1 on failure. @@ -158,3 +161,108 @@ ELFNAME(ldd)(int fd, char *path, const c return 0; } + +void +fmtprint(const char *libname, Obj_Entry *obj, const char *fmt1, + const char *fmt2) +{ + const char *libpath = obj ? obj->path : "not found"; + char libnamebuf[200]; + char *libmajor = NULL; + const char *fmt; + char *cp; + int c; + + if (strncmp(libname, "lib", 3) == 0 && + (cp = strstr(libname, ".so")) != NULL) { + size_t i = cp - (libname + 3); + + if (i >= sizeof(libnamebuf)) + i = sizeof(libnamebuf) - 1; + (void)memcpy(libnamebuf, libname + 3, i); + libnamebuf[i] = '\0'; + if (cp[3] && isdigit((unsigned char)cp[4])) + libmajor = &cp[4]; + libname = libnamebuf; + } + + if (fmt1 == NULL) + fmt1 = libmajor != NULL ? + "\t-l%o.%m => %p\n" : + "\t-l%o => %p\n"; + if (fmt2 == NULL) + fmt2 = "\t%o => %p\n"; + + fmt = libname == libnamebuf ? fmt1 : fmt2; + while ((c = *fmt++) != '\0') { + switch (c) { + default: + putchar(c); + continue; + case '\\': + switch (c = *fmt) { + case '\0': + continue; + case 'n': + putchar('\n'); + break; + case 't': + putchar('\t'); + break; + } + break; + case '%': + switch (c = *fmt) { + case '\0': + continue; + case '%': + default: + putchar(c); + break; + case 'A': + printf("%s", main_local); + break; + case 'a': + printf("%s", main_progname); + break; + case 'o': + printf("%s", libname); + break; + case 'm': + printf("%s", libmajor); + break; + case 'n': + /* XXX: not supported for elf */ + break; + case 'p': + printf("%s", libpath); + break; + case 'x': + printf("%p", obj ? obj->mapbase : 0); + break; + } + break; + } + ++fmt; + } +} + +void +print_needed(Obj_Entry *obj, const char *fmt1, const char *fmt2) +{ + const Needed_Entry *needed; + + for (needed = obj->needed; needed != NULL; needed = needed->next) { + const char *libname = obj->strtab + needed->name; + + if (needed->obj != NULL) { + if (!needed->obj->printed) { + fmtprint(libname, needed->obj, fmt1, fmt2); + needed->obj->printed = 1; + print_needed(needed->obj, fmt1, fmt2); + } + } else { + fmtprint(libname, needed->obj, fmt1, fmt2); + } + } +}