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