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);
+		}
+	}
+}

Reply via email to