ld.so/ 40755 147 456 0 5526325214 10272 5ustar davidengrld.so/static/ 40755 147 456 0 5526032320 11552 5ustar davidengrld.so/Makefile100644 147 456 2360 5525541161 12030 0ustar davidengrLDSO_ADDR = 62f00000 LDSO_ENTRY = "(0x$(LDSO_ADDR)+32)" STRIP = -s #CFLAGS = -Wall -DDEBUG #-O2 -DTIMER CFLAGS = -Wall -O2 -fomit-frame-pointer DEBUG_CFLAGS = -Wall -DDEBUG_LIB -g LDFLAGS = $(STRIP) -N LDLIBS = -lm STATIC_DIR = static STATIC_OBJS = fixups.o fdprintf.o vsprintf.o ctype.o strerror.o \ __load.o ld.so.o ifndef RANLIB RANLIB = ranlib endif ifdef QMAGIC LDSO_LIBS = -qmagic CFLAGS += -DLDSO_QMAGIC LDFLAGS = $(STRIP) -Wl,-qmagic endif ALL = ldconfig ldd ld.so testi testf libldso.a all: $(ALL) install: all instldso.sh ldconfig: ldconfig.o __load.o $(CC) -static $(CFLAGS) $(LDFLAGS) $^ -o $@ ldd: ldd.o __load.o testi: testi.o __load.o testf: testf.o __load.o ld.so: preld.o ld.so.o fixups.o fdprintf.o vsprintf.o ctype.o strerror.o $(LD) -static -o $@ -T $(LDSO_ADDR) $^ $(STRIP) -lc $(LDSO_LIBS) ldd.o: ldd.c $(CC) -c $(CFLAGS) -DLDSO_ADDR=$(LDSO_ENTRY) $< -o $@ __load.o: __load.c $(CC) -c $(CFLAGS) -DLDSO_ADDR=$(LDSO_ENTRY) $< -o $@ clean: rm -f $(ALL) *.o *~ core rm -f libldso.a $(STATIC_DIR)/*.o $(STATIC_DIR)/%.o: %.c $(CC) -c $(DEBUG_CFLAGS) -o $@ $*.c libldso.a:: @[ -d $(STATIC_DIR) ] || mkdir $(STATIC_DIR) libldso.a:: libldso.a($(STATIC_OBJS:%.o=$(STATIC_DIR)/%.o) preld.o) $(RANLIB) $@ ld.so/README100644 147 456 6760 5526032132 11252 0ustar davidengrThis package contains my shared, dynamic linker (ld.so) and utilities (ldconfig and ldd) for Linux. For those that were not involved in the development of ld.so, its main feature is that the user-level, shared library and dynamic linking support has been moved to its own, special shared library. This has two significant advantages. First, the startup code for all binaries, which must be linked statically, is reduced by about 2.5k. Second, and probably more important, the shared library and dynamic linking support can be upgraded for all binaries without having to relink by simply installing a new ld.so. In addition to ld.so, this package also includes two, related utilities, ldconfig and ldd. Ldconfig is used to automatically update symbolic links to shared libraries and build the library cache used by ld.so. This should hopefully put an end to the common problem of accidentally deleting a critical library link (eg. /lib/libc.so.4). Ldd is used to list the shared libraries dependencies for a binary. Please see the included manual pages for further details. To install, simply run "sh instldso.sh" as root. Ready-to-go versions of all end-products are provided so nothing should need to be compiled or linked. Notable contributors to this package include Eric Youngdale, Peter MacDonald, Hongjiu Lu, Linus Torvalds, Lars Wirzenius and Mitch D'Souza (not necessarily in that order). Changes in version 1.4.3: Fixed an obscure bug in ld.so where an index was not being incremented when a library was not found using the cache. Changes in version 1.4.2: Changed ldconfig to issue a warning and continue instead of an error and exiting when a link can't be updated. This is useful when some libraries are imported on read- only file systems, such as an NFS mounted /usr. Changed ld.so to be more robust in searching for libraries. A library is not considered found unless it can actually be loaded. If a library is not found using the cache, the standard directories are searched as in pre-cache versions. Changes in version 1.4.1: Fixed minor Makefile problems. Added support for linux-68k. Fixed a bug in ld.so where libraries with absolute paths were not handled correctly. Changed ld.so to ignore the directory in the names of shared libraries by default. This allows older libraries with absolute paths, such as the XView libraries, to take advantage of the cache support. Added a minimal usage message to ldconfig. Changes in version 1.4: Fixed bug in ld.so where minor version numbers were not reported correctly when a minor version incompatibility was found. Fixed bug in ldconfig where libraries with subversion numbers greater than 9 were not compared correctly. Added Mitch D'Souza's support for suppressing warning messages from ld.so about minor version incompatibilities. Added Mitch D'Souza's support for using a cache to speed up searching for libraries in the standard directories. Added Mitch D'Souza's support for a debugging version of ld.so. Link with -lldso if you think you are experiencing dynamic linker problems. Changes in version 1.3: Added support for libraries using absolute pathnames. If I had known that the XView libraries used them, I would have added this earlier. Fixed a bug handling old libraries using a pathname beginning with '/' or '/lib/'. Changes in version 1.2a: Fixed a minor bug in ldd which caused all files, specifically scripts, to be recognized as binaries. Thanks to Olaf Flebbe for reporting it. David Engel david@ods.com ld.so/__load.c100644 147 456 10260 5522621603 11764 0ustar davidengr/* * Copyright (c) 1994 Eric Youngdale, Peter MacDonald, David Engel, * Hongjiu Lu and Mitch D'Souza. * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Eric Youngdale, * Peter MacDonald, David Engel and Hongjiu Lu. * 3. The name of the above contributors may not be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* Notice of general intent: * * The linux operating system generally contains large amounts of code * that fall under the GNU General Public License, or GPL for short. * This file contains source code that by it's very nature would always * be linked with an application program, and because of this a GPL type * of copyright on this file would place restrictions upon the * distribution of binary-only commercial software. Since the goal of the * Linux project as a whole is not to discourage the development and * distribution of commercial software for Linux, this file has been placed * under a more relaxed BSD-style of copyright. * * It is the general understanding of the above contributors that a * program executable linked to a library containing code that falls * under the GPL or GLPL style of license is not subject to the terms of * the GPL or GLPL license if the program executable(s) that are supplied * are linked to a shared library form of the GPL or GLPL library, and as long * as the form of the shared library is such that it is possible for * the end user to modify and rebuild the library and use it in * conjunction with the program executable. */ #include #include #include #include #include #include #include "config.h" #include "fixups.h" static int errno = 0; static _syscall1(int,exit,int,code) static _syscall1(int,uselib,const char *,filename) static _syscall3(ssize_t,write,int,fd,const void *,buf,size_t,count) static _syscall2(int,munmap,caddr_t,addr,size_t,len) extern struct libentry * __SHARED_LIBRARIES__[]; extern struct fixuplist _SHARABLE_CONFLICTS__; void __load_shared_libraries (int argc, char **argv, char **envp) { if (__SHARED_LIBRARIES__[2]) { #ifndef DEBUG_LIB unsigned mapinfo[2]; /* this must be volatile to work with -O, GCC bug? */ volatile loadptr loader = (loadptr)LDSO_ADDR; if (uselib(LDSO_IMAGE)) { char *p = argv[0]; char errmsg[] = ": can't load dynamic linker '" LDSO_IMAGE "'\n"; if (p) { while (*p) p++; write(2, argv[0], p-argv[0]); } write(2, errmsg, sizeof errmsg); while (1) exit(128); } loader((argc <= 0) ? FUNC_LDD : FUNC_LINK, mapinfo, argv[0], envp, __SHARED_LIBRARIES__, &_SHARABLE_CONFLICTS__); munmap((caddr_t)mapinfo[0], mapinfo[1]); #else shared_loader((argc <= 0) ? FUNC_LDD : FUNC_LINK, argv[0], envp,__SHARED_LIBRARIES__, &_SHARABLE_CONFLICTS__); #endif } else { char msg[] = "\tstatically linked\n"; if (argc<=0) write (2, msg, sizeof msg); } if (argc <= 0) while (1) exit(0); } ld.so/config.h100644 147 456 1667 5526031420 12010 0ustar davidengr#ifdef DEBUG # define LDSO_IMAGE "ld.so" # define LDSO_CONF "ld.so.conf" # define LDSO_CACHE "ld.so.cache" #else # define LDSO_IMAGE "/lib/ld.so" # define LDSO_CONF "/etc/ld.so.conf" # define LDSO_CACHE "/etc/ld.so.cache" #endif #define VERSION "1.4.3" #define LDD_ARGV0 "__LDD_ARGV0" #define DIR_SEP ":, \t\n" #define MAX_DIRS 32 #define DEFAULT_PATH "/usr/lib:/lib" typedef void (*loadptr)(int func, ...); #define FUNC_VERS 0 #define FUNC_LDD 1 #define FUNC_LINK 2 #define LDSO_CACHE_MAGIC "ld.so-" #define LDSO_CACHE_MAGIC_LEN (sizeof LDSO_CACHE_MAGIC -1) #define LDSO_CACHE_VER VERSION #define LDSO_CACHE_VER_LEN (sizeof LDSO_CACHE_VER -1) typedef struct { char magic [LDSO_CACHE_MAGIC_LEN]; char version [LDSO_CACHE_VER_LEN]; char ndirs; char nlibs; long liboffset; long diroffset; } header_t; typedef struct { short libnamelen; short dirnamelen; long liboffset; long diroffset; } libentry_t; ld.so/ctype.c100644 147 456 2276 5377774435 11707 0ustar davidengr/* * ctype.c * * Copyright (C) 1991, 1992 Linus Torvalds */ #include char _ctmp; unsigned char _ctype[] = {0x00, /* EOF */ _C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */ _C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */ _C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */ _C,_C,_C,_C,_C,_C,_C,_C, /* 24-31 */ _S|_SP,_P,_P,_P,_P,_P,_P,_P, /* 32-39 */ _P,_P,_P,_P,_P,_P,_P,_P, /* 40-47 */ _D,_D,_D,_D,_D,_D,_D,_D, /* 48-55 */ _D,_D,_P,_P,_P,_P,_P,_P, /* 56-63 */ _P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U, /* 64-71 */ _U,_U,_U,_U,_U,_U,_U,_U, /* 72-79 */ _U,_U,_U,_U,_U,_U,_U,_U, /* 80-87 */ _U,_U,_U,_P,_P,_P,_P,_P, /* 88-95 */ _P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */ _L,_L,_L,_L,_L,_L,_L,_L, /* 104-111 */ _L,_L,_L,_L,_L,_L,_L,_L, /* 112-119 */ _L,_L,_L,_P,_P,_P,_P,_C, /* 120-127 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 128-143 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-159 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 160-175 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 176-191 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 192-207 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 208-223 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 224-239 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; /* 240-255 */ ld.so/ld.so.c100644 147 456 27733 5526031366 11610 0ustar davidengr/* * Copyright (c) 1994 Eric Youngdale, Peter MacDonald, David Engel, * Hongjiu Lu and Mitch D'Souza * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Eric Youngdale, * Peter MacDonald, David Engel and Hongjiu Lu. * 3. The name of the above contributors may not be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* Notice of general intent: * * The linux operating system generally contains large amounts of code * that fall under the GNU General Public License, or GPL for short. * This file contains source code that by it's very nature would always * be linked with an application program, and because of this a GPL type * of copyright on this file would place restrictions upon the * distribution of binary-only commercial software. Since the goal of the * Linux project as a whole is not to discourage the development and * distribution of commercial software for Linux, this file has been placed * under a more relaxed BSD-style of copyright. * * It is the general understanding of the above contributors that a * program executable linked to a library containing code that falls * under the GPL or GLPL style of license is not subject to the terms of * the GPL or GLPL license if the program executable(s) that are supplied * are linked to a shared library form of the GPL or GLPL library, and as * long as the form of the shared library is such that it is possible for * the end user to modify and rebuild the library and use it in * conjunction with the program executable. */ #define exit libc_exit #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "fixups.h" #include #undef exit #define EXIT_FATAL 128 #define VMAJOR(x) (((x) & MAJOR_MASK) >> 16) #define VMINOR(x) (((x) & MINOR_MASK) / 100) #define VPATCH(x) (((x) & MINOR_MASK) % 100) #define TOTAL_COMPATIBLE 0 #define MAJOR_COMPATIBLE 1 #define NOT_COMPATIBLE 2 int errno = 0; char **__environ = 0; extern int _entry; extern int _edata; int fdprintf(int fd, const char *fmt, ...); _syscall1(int,exit,int,code) static caddr_t cache_init (char *, size_t *); static int incompatible(int in_core, int linked) { return (VMAJOR(in_core) == VMAJOR(linked)) ? ((VMINOR(in_core) >= VMINOR(linked)) ? TOTAL_COMPATIBLE : MAJOR_COMPATIBLE) : NOT_COMPATIBLE; } /* parse a list of directories and add them to the search list */ static int add_dirs(char *argv0, int ndirs, char *libdir[], char *path) { static int toomany = 0; for (path = strtok(path, DIR_SEP); path && ndirs < MAX_DIRS; path = strtok(NULL, DIR_SEP)) libdir[ndirs++] = path; /* how can you keep track of this many directories? */ if (path && !toomany++) fdprintf(2, "%s: too many directories in library path\n", argv0); return ndirs; } static int try_lib(char *argv0, char *buffer, char *dir, char *lib) { int found; strcpy(buffer, dir); strcat(buffer, "/"); strcat(buffer, lib); if (!(found = !uselib(buffer))) { if (errno != ENOENT) { fdprintf(2, "%s: can't load library '%s'\n", argv0, buffer); fdprintf(2, "\t%s\n", strerror(errno)); } } return found; } #ifndef DEBUG_LIB /* store our address information so we can be unmapped */ static void save_mapinfo(unsigned *mapinfo) { if (mapinfo) { #ifdef LDSO_QMAGIC mapinfo[0] = (unsigned)&_entry-0x20; #else mapinfo[0] = (unsigned)&_entry; #endif mapinfo[1] = ((unsigned)&_edata-(unsigned)&_entry+0xfff) & ~0xfff; } } #endif void shared_loader(int func, ...) { int ndirs = 0; char *libdir[MAX_DIRS]; struct libentry **ptr; char *cp; int i, fd, ldd = 0; char defpath[] = DEFAULT_PATH; va_list ap; struct libentry **__SHARED_LIBRARIES__; struct fixuplist *_SHARABLE_CONFLICTS__; char *argv0; #ifndef DEBUG_LIB unsigned *mapinfo = NULL; #endif int nowarn; int keepdir; caddr_t cache_addr; size_t cache_size; #ifdef TIMER #include long clk; clk = clock(); #endif switch (func) { case FUNC_VERS: /* tell 'em who we are */ fdprintf(1, "%s: version %s\n", LDSO_IMAGE, VERSION); #ifndef DEBUG_LIB va_start(ap, func); mapinfo = va_arg(ap, unsigned *); save_mapinfo(mapinfo); va_end(ap); #endif return; case FUNC_LDD: /* just going through the motions */ ldd = 1; /* fall through */; case FUNC_LINK: /* this is why we're all here */ va_start(ap, func); #ifndef DEBUG_LIB mapinfo = va_arg(ap, unsigned *); save_mapinfo(mapinfo); argv0 = va_arg(ap, char *); #endif __environ = va_arg(ap, char **); __SHARED_LIBRARIES__ = va_arg(ap, struct libentry **); _SHARABLE_CONFLICTS__ = va_arg(ap, struct fixuplist *); va_end(ap); break; default: /* you want me to do what? */ fdprintf(2, "%s: invalid dynamic linker option %d\n", LDSO_IMAGE, func); exit(EXIT_FATAL); } /* read any environmental options */ nowarn = getenv("LD_NOWARN") != NULL; keepdir = getenv("LD_KEEPDIR") != NULL; /* find out who we are, in case somebody wants to know */ if (!argv0 && !(argv0 = getenv(LDD_ARGV0))) argv0 = LDSO_IMAGE; /* so you want your own path, do you? */ if ((cp = getenv("LD_LIBRARY_PATH")) && *cp) { uid_t uid = getuid(); if (uid && (uid != geteuid() || getgid() != getegid())) { /* sorry Charlie, I can't let you do that */ *cp = '\0'; } else { /* Well OK, I'll allow it - this time */ char *temp = alloca(strlen(cp) + 1); ndirs = add_dirs(argv0, ndirs, libdir, strcpy(temp, cp)); } } /* If the cache exists then we don't add these */ if (!(cache_addr = cache_init(LDSO_CACHE, &cache_size))) { /* big brother wants you to use these also */ if ((fd = open(LDSO_CONF, O_RDONLY, 0)) >= 0) { struct stat stat; fstat(fd, &stat); cp = alloca(stat.st_size + 1); read(fd, cp, stat.st_size); close(fd); cp[stat.st_size] = '\0'; ndirs = add_dirs(argv0, ndirs, libdir, cp); } /* these might also be useful */ ndirs = add_dirs(argv0, ndirs, libdir, defpath); } /* OK, enough formalities, which libs do you want? */ for (ptr = __SHARED_LIBRARIES__+2; *ptr; ptr++) { char buffer[PATH_MAX+1]; unsigned *vers = (unsigned *)(*ptr)->addr; int found; /* ignore directory part unless told not to */ if ((cp = strrchr((*ptr)->name, '/')) && !keepdir) cp++; else cp = (*ptr)->name; /* OK, I'll see if I can find it for you */ if (*cp == '/') { /* an absolute name, this one is easy */ strcpy(buffer, cp); found = !access(buffer, F_OK); } else { /* a relative name, guess I'll have to search */ /* let's try the normal directory list first */ for (found = 0, i = 0; !found && i < ndirs; i++) found = try_lib(argv0, buffer, libdir[i], cp); /* not there, maybe it's in the cache library list */ if (!found && cache_addr) { short libnamelen = strlen(cp); header_t *header = (header_t *)cache_addr; libentry_t *libent = (libentry_t *)(cache_addr + sizeof(header_t)); for (i = 0; !found && i < header->nlibs; i++) { if (libnamelen == (libent[i].libnamelen >> 8) && !memcmp(cp, cache_addr + header->liboffset + libent[i].liboffset, libnamelen)) found = try_lib(argv0, buffer, cache_addr + header->diroffset + libent[i].diroffset, cache_addr + header->liboffset + libent[i].liboffset); } /* nope, last resort is the cache directory list */ if (!found) { char *dir = cache_addr + header->diroffset; for (i = 0; !found && i < header->ndirs; i++, dir += strlen(dir) + 1) found = try_lib(argv0, buffer, dir, cp); } } } /* OK, let's take a look and see what we've found */ if (!found) { /* methinks somebody's pulling our leg */ if (ldd) fdprintf(1, "\t%s (%s) => not found\n", cp, (*ptr)->avers); else { fdprintf(2, "%s: can't find library '%s'\n", argv0, cp); exit(EXIT_FATAL); } } else { /* hey, I think I've got a live one here */ if (ldd) { /* no thanks, I'm just browsing */ fdprintf(1, "\t%s (%s) => %s\n", cp, (*ptr)->avers, buffer); } else { /* so far, so good, but is it the real thing? */ switch (incompatible(*vers, (*ptr)->vers)) { case MAJOR_COMPATIBLE: if (!nowarn) { /* don't you keep your system up to date? */ fdprintf(2, "%s: using incompatible library '%s'\n", argv0, buffer); fdprintf(2, "\tDesire minor version >= %d and found %d\n", VMINOR((*ptr)->vers), VMINOR(*vers)); } break; case NOT_COMPATIBLE: /* methinks somebody is lying to us */ fdprintf(2, "%s: incompatible library '%s'\n", argv0, buffer); fdprintf(2, "\tRequire major version %d and found %d\n", VMAJOR((*ptr)->vers), VMAJOR(*vers)); exit(EXIT_FATAL); break; } } } } /* we can unmap ld.so.cache if it exists */ if (cache_addr) munmap(cache_addr, cache_size); #ifdef TIMER fdprintf(1, "%ld CPU seconds spent in ld.so\n", clock()-clk); #endif /* the rest of this program is brought to you by Eric Youngdale */ if (!ldd) { char err[] = "dynamic linker error in"; /* Subtract curr addr from .long _foo */ if (__do_fixups(_SHARABLE_CONFLICTS__, 0)) { fdprintf(2, "%s: %s fixup pass 1\n", err, argv0); exit(EXIT_FATAL); } if (__dynamic_resolve (_SHARABLE_CONFLICTS__)) { fdprintf(2, "%s: %s resolve pass\n", err, argv0); exit(EXIT_FATAL); } /* Add (possibly) new addr to .long _foo */ if (__do_fixups(_SHARABLE_CONFLICTS__, 1)) { fdprintf(2, "%s: %s fixup pass 2\n", err, argv0); exit(EXIT_FATAL); } /* Set the magic numbers back to the starting values for emacs */ if (__reset_magic(_SHARABLE_CONFLICTS__)) { fdprintf(2, "%s: %s reset pass\n", err, argv0); exit(EXIT_FATAL); } } } static caddr_t cache_init(char *file, size_t *size) { int fd; struct stat st; caddr_t cache_addr; if (stat(LDSO_CACHE, &st) || (fd = open(LDSO_CACHE, O_RDONLY)) < 0) return NULL; *size = st.st_size; if ((cache_addr = mmap(0, *size, PROT_READ, MAP_SHARED, fd, 0)) == (caddr_t)-1) { fdprintf(2, "%s: can't map cache '%s'\n", LDSO_IMAGE, LDSO_CACHE); close(fd); return NULL; } close(fd); if (memcmp(((header_t *)cache_addr)->magic, LDSO_CACHE_MAGIC, LDSO_CACHE_MAGIC_LEN)) { fdprintf(2, "%s: cache '%s' is corrupt\n", LDSO_IMAGE, LDSO_CACHE); no_cache: munmap(cache_addr, *size); return NULL; } if (memcmp(((header_t *)cache_addr)->version, LDSO_CACHE_VER, LDSO_CACHE_VER_LEN)) { fdprintf(2, "%s: cache '%s' has wrong version\n", LDSO_IMAGE, LDSO_CACHE); goto no_cache; } return cache_addr; } ld.so/fdprintf.c100644 147 456 633 5437756536 12351 0ustar davidengr/* * print.c * * Copyright (C) 1991, 1992 Linus Torvalds * * Adapted by David Engel from Linus' printk.c. */ #include #include extern int vsprintf(char * buf, const char * fmt, va_list args); int fdprintf(int fd, const char *fmt, ...) { va_list args; int i; char buf[1024]; va_start(args, fmt); i=vsprintf(buf,fmt,args); va_end(args); write(fd, buf, i); return i; } ld.so/fixups.c100644 147 456 16570 5377673755 12126 0ustar davidengr/* * Copyright (c) 1993 Eric Youngdale, Peter MacDonald, David Engel * and Hongjiu Lu. * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Eric Youngdale, * Peter MacDonald, David Engel and Hongjiu Lu. * 3. The name of the above contributors may not be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* Notice of general intent: * * The linux operating system generally contains large amounts of code * that fall under the GNU General Public License, or GPL for short. * This file contains source code that by it's very nature would always * be linked with an application program, and because of this a GPL type * of copyright on this file would place restrictions upon the * distribution of binary-only commercial software. Since the goal of the * Linux project as a whole is not to discourage the development and * distribution of commercial software for Linux, this file has been placed * under a more relaxed BSD-style of copyright. * * It is the general understanding of the above contributors that a * program executable linked to a library containing code that falls * under the GPL or GLPL style of license is not subject to the terms of * the GPL or GLPL license if the program executable(s) that are supplied * are linked to a shared library form of the GPL or GLPL library, and as long * as the form of the shared library is such that it is possible for * the end user to modify and rebuild the library and use it in * conjunction with the program executable. */ #include #include "fixups.h" /* Here we fix addresses of global variables that are stored in the data section (or stored as data in the text section).d We wait to do this until after all of the GOT pointers have been updated by __dynamic_resolve because this is where we are copying our numbers from */ int __reset_magic(struct fixuplist * xpnt) { int size; /* Now go back through and reset the magic numbers. The only reason we need to do this is that we must allow for the possiblility of the memory image being dumped to a new executable (i.e. emacs). */ if(*xpnt->magic == 0xfeeb1ed3) return 0; /* This means we have been through here before */ if(*xpnt->magic != 0xfeeb1ed6) return -1; (*xpnt->magic) = 0xfeeb1ed3; /* Reset back to the original value */ size = (unsigned int) xpnt->size - 3; /* First recurse through the various shared libraries we are linked to */ while(size >= 0) if (__reset_magic(**xpnt->shrlib_list[size--])) return -1; return 0; } int __do_fixups(struct fixuplist * xpnt, int flag) { int size; struct builtin_fixup * bpnt; /* Now we walk through the list of pointers that need to be updated. This is essentially our dynamic linking. Strictly speaking this is somewhat simpler, because all we are really doing is fixing the scope of variables and functions so that functions are used in the same was as they would be if we were linked statically. */ if(*xpnt->magic == 0xfeeb1ed4 + (flag << 1)) return 0; /* This means we have been through here before */ if(*xpnt->magic != 0xfeeb1ed3 + (flag << 1)) return -1; (*xpnt->magic)++; /* This is so we know if we have been through here before */ size = (unsigned int) xpnt->size - 3; /* First recurse through the various shared libraries we are linked to */ while(size >= 0) if (__do_fixups(**xpnt->shrlib_list[size--], flag)) return -1; /* Now get the pointer to the builtin fixups. */ bpnt = xpnt->list->fix[xpnt->list->size].un.bifu; /* If there are fixups, then we scan through the various files that have tables, and apply all of the fixups in the table. Consider that an address could be stored as: .long _foo+3 we allow for the offset by first subracting the value of _foo that the linker assigned, then using __dynamic_resolve to fix all of the GOT entries that need to be fixed, and then adding in the new offset of the (possibly) new value of _foo */ if(bpnt) for(size = 0; size < bpnt->len; size++) { int i = 0; struct file_fixup * fpnt; fpnt = bpnt->fixpnt[size]; while(1==1){ if(!fpnt->fixup[i].gotaddr) break; if(!flag) *fpnt->fixup[i].fixaddr -= *fpnt->fixup[i].gotaddr; else *fpnt->fixup[i].fixaddr += *fpnt->fixup[i].gotaddr; i++; }; }; return 0; } int __dynamic_resolve(struct fixuplist * xpnt) { /* Now we walk through the list of pointers that need to be updated. This is essentially our dynamic linking. Strictly speaking this is somewhat simpler, because all we are really doing is fixing the scope of variables and functions so that functions are used in the same was as they would be if we were linked statically. */ int size; /* Check for the magic number to make sure that we really have a proper fixup table */ if(*xpnt->magic == 0xfeeb1ed5) return 0; /* This means we have been through here before */ if(*xpnt->magic != 0xfeeb1ed4) return -1; (*xpnt->magic)++; /* This is so we catch circularly linked libraries */ size = (unsigned int) xpnt->size - 3; /* Recurse through the shared libraries, one by one */ while(size >= 0) if (__dynamic_resolve(**xpnt->shrlib_list[size--])) return -1; /* Now that this is done, perform the fixups that were generated when this image was linked. */ for(size = 0; size < xpnt->list->size; size++) { if(!xpnt->list->fix[size].un.newaddr) break; *xpnt->list->fix[size].fixaddr = xpnt->list->fix[size].un.newaddr; }; /* Now handle the linker-identified fixups. These are listed as a pair of GOT addresses - the difference is that these are represent a pair of pointers to GOT entries rather than a new address and a GOT address. There are a pair of longword NULL pointers that separate the linker identified fixups from the linker identified places where we simply copy a pointer. We are effectively replacing pointers in the GOT variables here. */ while (++size < xpnt->list->size){ *xpnt->list->fix[size].fixaddr = *((int *) xpnt->list->fix[size].un.newaddr); size++; }; return 0; } ld.so/fixups.h100644 147 456 13343 5377672356 12122 0ustar davidengr#ifndef _FIXUPS_H #define _FIXUPS_H /* * Copyright (c) 1993 Eric Youngdale, Peter MacDonald, David Engel * and Hongjiu Lu. * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Eric Youngdale, * Peter MacDonald, David Engel and Hongjiu Lu. * 3. The name of the above contributors may not be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* Notice of general intent: * * The linux operating system generally contains large amounts of code * that fall under the GNU General Public License, or GPL for short. * This file contains source code that by it's very nature would always * be linked with an application program, and because of this a GPL type * of copyright on this file would place restrictions upon the * distribution of binary-only commercial software. Since the goal of the * Linux project as a whole is not to discourage the development and * distribution of commercial software for Linux, this file has been placed * under a more relaxed BSD-style of copyright. * * It is the general understanding of the above contributors that a * program executable linked to a library containing code that falls * under the GPL or GLPL style of license is not subject to the terms of * the GPL or GLPL license if the program executable(s) that are supplied * are linked to a shared library form of the GPL or GLPL library, and as long * as the form of the shared library is such that it is possible for * the end user to modify and rebuild the library and use it in * conjunction with the program executable. */ /* This list is generated by the linker - it corresponds to the SETD list generated in conjunction with the variable __SHARABLE_CONFLICTS__. The linker does not do anything special with this symbol - it simply puts together the pieces that are needed. The list of fixups to local variables is generated internally by the linker, and ld fills in this one field as a special case before writing the image. The array size is listed as 1, but it would actually be ->size - 2. __load.c will pick up this pointer and pass it to __dynamic_resolve() and __do_fixups(). */ struct fixuplist { /* This list is generated by the linker */ int size; int * magic; /* Used for verification purposes */ struct image_fixuplist * list; /* Fixups to local variables */ struct fixuplist *** shrlib_list[1]; /* One for each sharable library this program is linked to. The sharable libraries are linked to other sharable libraries, so we have to walk this tree and resolve all of the fixups. */ }; /* This is a linker-generated list of fixups. The linker essentially watches for multiple definitions of symbols, and if there is a __GOT__ symbol then it does not flag an error condition. Instead, it adds a fixup to the fixuplist which will correct the __GOT__ that appears later on the link command line. The number of pointer pairs is always specified by the size field, and after the last pointer pair is the pointer to the builtin_fixups. */ struct image_fixuplist { int size; struct elemental_fixup { union { int newaddr; struct builtin_fixup* bifu; }un; int * fixaddr; } fix[1]; }; /* Each link image (sharable libraries are each considered a sharable link image) will have a list of builtin fixups as well, as many as one for each source file that went into the link image. These lists are generated by jumpas as needed (perhaps one per source file), and a SETD symbol __BUILTIN_FIXUPS__. These will never appear in a user program - only in a shared library. This structure contains a series of pointers to these different lists, and we need to walk through and apply all of the fixups. The array size is listed as 1, but it can be any number */ struct builtin_fixup { int len; struct file_fixup * fixpnt[1]; /* Potentially one for every source file that was linked */ }; /* Each source file can potentially have one of these beasts. There are a series of pointer pairs, terminated by a NULL. The idea here is that we are supposed to copy the number out of gotaddr and store it at fixaddr. This is the list that is generated by the jumpas tool. This is listed with an array size of 1, but it can be any number. */ struct file_fixup { struct builtin_elemental_fixup { int * gotaddr; int * fixaddr; } fixup[1]; }; int __reset_magic(struct fixuplist * xpnt); int __do_fixups(struct fixuplist * xpnt, int flag); int __dynamic_resolve(struct fixuplist * xpnt); #endif /* _FIXUPS_H */ ld.so/ld.so.8100644 147 456 7612 5524307421 11503 0ustar davidengr.TH ld.so 8 "3 February 1994" .SH NAME ld.so \- dynamic linker/loader .SH DESCRIPTION .B ld.so completes the final process of linking all necessary references to sharable objects and unreferenced symbols in an impure executable, (usually a .I dynamically .I linked .IR executable ), to produce a runnable file. .PP Unless explicitly specified via the .B \-static option to .B ld during compilation, all Linux binaries in a.out format will be "incomplete" and require further linking at run time. .BR ld.so 's job is thus to complete the linking process started at compilation. .PP The necessary dynamically linked libraries (DLL's) which the executable requires to complete it's linking process are searched for in the following order .IP o Using the environment variable .BR LD_LIBRARY_PATH . Except if the executable is a setuid/setgid binary, in which case the LD_LIBRARY_PATH is ignored. .IP o From the cache file .BR /etc/ld.so.cache which contains a compiled list of candidate libraries previously found in the augmented library path. .IP o From the configuration file .BR /etc/ld.so.conf which specifies a list of delimited directories to augment the default path. .IP o In the default path .BR /usr/lib , and then .BR /lib . .SH MESSAGES The following, possibly fatal, warnings may be output by .B ld.so .TP .SB can't find library 'libfoo' If .B ld.so cannot find the library the executable requires anywhere. .TP .SB can't load library 'libfoo' If the library is corrupt. .TP .SB incompatible library 'libfoo' .PD 0 .TP .SB Require major version x and found y .PD .B ld.so cannot use the library version found as it is incompatable with the binary attempting to be executed. .TP .SB using incompatible library 'libfoo' .PD 0 .TP .SB Desire minor version >= x and found y .PD Even though the minor version is incompatable .B ld.so will attempt to use it. This message is suppressed if the environment variable .B LD_NOWARN is set. .TP .SB too many directories in library path There is a hard coded limit of 32 search directories. The above warning will ensue it this limit is exceeded. .TP .SB dynamic linker error in fixup pass 1,2 .PD 0 .TP .SB dynamic linker error in resolve pass .TP .SB dynamic linker error in reset pass .PD An attempt to perform necessary fixups and or relocations failed. These are usually fatal and signifies possible binary corruption. .TP .SB can't map cache file '/etc/ld.so.cache' .PD 0 .TP .SB cache file '/etc/ld.so.cache' is corrupt .TP .SB cache file '/etc/ld.so.cache' has wrong version .TP .SB cache file '/etc/ld.so.cache' is empty .PD A problem was encountered with the cache. Execution will continue as if the cache did not exist. .SH ENVIRONMENT .TP .SB LD_LIBRARY_PATH A colon-separated list of directories in which to search for libraries at execution-time. Similar to the .SB PATH environment variable. .TP .SB LD_NOWARN Suppress warnings about libraries with incompatible minor version numbers. .TP .SB LD_KEEPDIR Don't ignore the directory in the names of libraries to be loaded. Use of this option is strongly discouraged. .SH FILES .PD 0 .TP 20 .B /lib/ld.so execution time linker/loader .TP .B /etc/ld.so.conf File containing a list of colon, space, tab, newline, or comma spearated directories in which to search for libraries required at execution-time. .TP .B /etc/ld.so.cache File containing a compiled list of directories in which to search for libraries and an ordered list of candidate libraries. .TP .B lib*.so.version shared libraries .TP .B lib*.sa exported initialized library data. .PD .SH SEE ALSO .BR ldd (1), .BR ldconfig (8). .SH BUGS .LP Currently .B ld.so has no means of unloading and searching for compatable or newer version of libraries. .PP .B ld.so functionality is only available for executables compiled using libc version 4.4.3 or greater. .SH AUTHORS David Engel, Eric Youngdale, Peter MacDonald, Hongjiu Lu, Linus Torvalds, Lars Wirzenius and Mitch D'Souza (not necessarily in that order). ld.so/ld.so.lsm100644 147 456 1640 5526325151 12124 0ustar davidengrBegin2 Title = Linux shared, dynamic linker and utilities. Version = 1.4.3 Desc1 = This package contains ld.so, ldconfig and ldd. Ld.so Desc2 = performs the user-level, shared library and dynamic Desc3 = linking support for Linux. Author = David Engel and others. AuthorEmail = david@ods.com Maintainer = David Engel MaintEmail = david@ods.com Site1 = tsx-11.mit.edu Path1 = /pub/linux/packages/GCC File1 = ld.so-1.4.3.tar.gz FileSize1 = 78k Site2 = sunsite.unc.edu Path2 = /pub/Linux/GCC File2 = ld.so-1.4.3.tar.gz FileSize2 = 78k Required1 = Linux-0.99pl12 or later, libc-4.4.1 or later. CopyPolicy1 = Copyrighted but freely distributable. Keywords = Linker, library, DLL, ld.so, ldd, ldconfig RelFiles1 = ld.so, ld.so.conf, ldconfig, ldd Entered = 09FEB94 EnteredBy = David Engel CheckedEmail = david@ods.com End ld.so/instldso.sh100755 147 456 1765 5524307745 12605 0ustar davidengr#!/bin/sh umask 022 if [ -e /etc/ld.so.cache ] ; then echo Deleting old /etc/ld.so.cache rm -f /etc/ld.so.cache fi if [ ! -e /etc/ld.so.conf ] ; then for dir in /usr/local/lib /usr/openwin/lib /usr/X386/lib ; do if [ -d $dir ] ; then echo Adding $dir to /etc/ld.so.conf echo $dir >> /etc/ld.so.conf fi done fi echo Installing ldd in /usr/bin install -c ldd /usr/bin if [ -e /lib/ld.so ] ; then echo Backing up existing ld.so ln -f /lib/ld.so /lib/ld.so.old fi echo Installing ld.so in /lib install -c ld.so /lib/ld.so.new ln -f /lib/ld.so.new /lib/ld.so rm /lib/ld.so.new if [ -d /sbin ] ; then echo Installing ldconfig in /sbin install -c ldconfig /sbin /sbin/ldconfig else echo Installing ldconfig in /etc install -c ldconfig /etc /etc/ldconfig fi echo Installing libldso.a in /usr/lib install -c -m 644 libldso.a /usr/lib echo Installing manual pages in /usr/man install -c -m 644 ldd.1 /usr/man/man1 install -c -m 644 ldconfig.8 ld.so.8 /usr/man/man8 echo Installation complete ld.so/ldconfig.8100644 147 456 5431 5522733643 12255 0ustar davidengr.TH ldconfig 8 "30 January 1994" .SH NAME ldconfig \- determine run-time link bindings .SH SYNOPSIS ldconfig [ .B \-DvnNX ] .IR directory \ ... .PD 0 .PP .PD ldconfig .B \-l [ .B \-Dv ] .IR library \ ... .PD 0 .PP .PD ldconfig .B \-p .SH DESCRIPTION .B ldconfig creates the necessary links and cache (for use by the run-time linker, .IR ld.so ) to the most recent shared libraries found in the directories specified on the command line, in the file .IR /etc/ld.so.conf , and in the trusted directories .RI ( /usr/lib and .IR /lib ). .I ldconfig checks the header and file names of the DLL's it encounters when determining which versions should have their links updated. .PP .I ldconfig should normally be run by the super-user as it may require write permission on some root owned directories and files. It is normally run automatically at bootup, from /etc/rc, or manually whenever new DLL's are installed. .SH OPTIONS .TP .B \-D Debug mode. Implies .B \-N and .BR \-X . .TP .B \-v Verbose mode. Print current version number, the name of each directory as it is scanned and any links that are created. .TP .B \-n Only process directories specified on the command line. Don't process the trusted directories .RI ( /usr/lib and .IR /lib ) nor those specified in .IR /etc/ld.so.conf . Implies .BR \-N . .TP .B \-N Don't rebuild the cache. Unless .B \-X is also specified, links are still updated. .TP .B \-X Don't update links. Unless .B \-N is also specified, the cache is still rebuilt. .TP .B \-l Library mode. Manually link individual libraries. Intended for use by experts only. .TP .B \-p Print the lists of directories and candidate libraries stored in the current cache. .SH EXAMPLES In the bootup file .I /etc/rc having the line .RS /etc/ldconfig -v .RE will set up the correct links for the shared binaries and rebuild the cache. .TP On the command line .RS # /etc/ldconfig -n /lib .RE as root after the installation of a new DLL, will properly update the shared library symbolic links in /lib. .SH FILES .PD 0 .TP 20 .B /lib/ld.so execution time linker/loader .TP 20 .B /etc/ld.so.conf File containing a list of colon, space, tab, newline, or comma spearated directories in which to search for libraries. .TP 20 .B /etc/ld.so.cache File containing a compiled list of directories in which to search for libraries and an ordered list of candidate libraries. .TP .B lib*.so.version shared libraries .PD .SH SEE ALSO .BR ldd (1), .BR ld.so (8). .SH BUGS .LP .BR ldconfig 's functionality, in conjunction with .BR ld.so , is only available for executables compiled using libc version 4.4.3 or greater. .PP .BR ldconfig , being a user process, must be run manually and has no means of dynamically determining and relinking shared libraries for use by .BR ld.so when a new DLL is installed. .SH AUTHOR David Engel and Mitch D'Souza. ld.so/ldconfig.c100644 147 456 42773 5525264722 12362 0ustar davidengr/* * ldconfig - update shared library symlinks * * usage: ldconfig [-DvnNX] dir ... * ldconfig -l [-Dv] lib ... * ldconfig -p * -D: debug mode, don't update links * -v: verbose mode, print things as we go * -n: don't process standard directories * -N: don't update the library cache * -X: don't update the library links * -l: library mode, manually link libraries * -p: print the current library cache * dir ...: directories to process * lib ...: libraries to link * * Copyright 1994 David Engel and Mitch D'Souza * * This program may be used for any purpose as long as this * copyright notice is kept. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" /* For SunOS */ #ifndef PATH_MAX #include #define PATH_MAX _POSIX_PATH_MAX #endif /* For SunOS */ #ifndef N_MAGIC #define N_MAGIC(exec) ((exec).a_magic & 0xffff) #endif #define EXIT_OK 0 #define EXIT_FATAL 128 char *prog = NULL; int debug = 0; /* debug mode */ int verbose = 0; /* verbose mode */ int libmode = 0; /* library mode */ int nocache = 0; /* don't build cache */ int nolinks = 0; /* don't update links */ #define LEN_SORT 0x1 #define NAME_SORT 0x2 #define CTIME_SORT 0x3 char sort_type = NAME_SORT; /* default to sort by name */ char *cachefile = LDSO_CACHE; /* default cache file */ signed char invert = 1; /* Invert any of the sort options */ void cache_print(void); void cache_dodir(char *, short); void cache_dolib(char *, short); void cache_write(void); void warn(char *fmt, ...) { va_list ap; fprintf(stderr, "%s: warning: ", prog); va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); return; } void error(char *fmt, ...) { va_list ap; fprintf(stderr, "%s: ", prog); va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); exit(EXIT_FATAL); } void *xmalloc(size_t size) { void *ptr; if ((ptr = malloc(size)) == NULL) error("out of memory"); return ptr; } char *xstrdup(char *str) { char *ptr; if ((ptr = strdup(str)) == NULL) error("out of memory"); return ptr; } /* if shared library, return length of base name, else return -1 */ int is_shlib(char *dir, char *name) { int good = 0; char *cp = name; FILE *file; struct exec exec; char buff[1024]; /* see if name is of the form libZ.so.M.N[.P] */ if (strncmp(name, "lib", 3) == 0 && (cp = strstr(name, ".so.")) && (cp = strchr(cp + 4, '.'))) { /* construct the full path name */ sprintf(buff, "%s%s%s", dir, (*dir && strcmp(dir, "/")) ? "/" : "", name); /* and then try opening it */ if (!(file = fopen(buff, "rb"))) warn("can't open %s (%s), skipping", buff, strerror(errno)); else { /* now make sure it's ZMAGIC with a non-zero address */ if (fread(&exec, sizeof exec, 1, file) < 1) warn("can't read header from %s, skipping", buff); else if (N_MAGIC(exec) != ZMAGIC) warn("%s is not a ZMAGIC file, skipping", buff); else if (!exec.a_entry) warn("%s has a zero load address, skipping", buff); else good = 1; /* looks good */ fclose(file); } } return good ? cp - name : -1; } /* update the symlink to new library */ void link_shlib(char *dir, char *file, int len) { int change = -1; char libname[1024]; char linkname[1024]; struct stat libstat; struct stat linkstat; /* construct the full path names */ sprintf(libname, "%s%s%s", dir, (*dir && strcmp(dir, "/")) ? "/" : "", file); sprintf(linkname, "%s%s%.*s", dir, (*dir && strcmp(dir, "/")) ? "/" : "", len, file); /* see if a link already exists */ if (!stat(linkname, &linkstat)) { /* now see if it's the one we want */ if (stat(libname, &libstat)) warn("can't stat %s (%s)", libname, strerror(errno)); else if (libstat.st_dev == linkstat.st_dev && libstat.st_ino == linkstat.st_ino) change = 0; } /* then update the link, if required */ if (change && !nolinks) { if (!lstat(linkname, &linkstat) && remove(linkname)) warn("can't unlink %s (%s)", linkname, strerror(errno)); else if (symlink(file, linkname)) warn("can't link %s to %s (%s)", linkname, file, strerror(errno)); else change = 1; } /* some people like to know what we're doing */ if (verbose) printf("\t%.*s => %s%s\n", len, file, file, change < 0 ? " (SKIPPED)" : (change > 0 ? " (changed)" : "")); return; } /* figure out which library is greater */ int libcmp(char *p1, char *p2) { while (*p1) { if (isdigit(*p1) && isdigit(*p2)) { /* must compare this numerically */ int v1, v2; v1 = strtoul(p1, &p1, 10); v2 = strtoul(p2, &p2, 10); if (v1 != v2) return v1 - v2; } else if (*p1 != *p2) return *p1 - *p2; else p1++, p2++; } return *p1 - *p2; } struct lib { char *name; /* name of a library */ int len; /* length of base name */ struct lib *next; /* next library in list */ }; /* update all shared library links in a directory */ void scan_dir(char *name) { DIR *dir; struct dirent *ent; int len; struct lib *lp, *libs = NULL; /* let 'em know what's going on */ if (verbose) printf("%s:\n", name); if (!nocache) cache_dodir(name, strlen(name)); /* if we can't open it, we can't do anything */ if ((dir = opendir(name)) == NULL) { warn("can't open %s (%s), skipping", name, strerror(errno)); return; } /* yes, we have to look at every single file */ while ((ent = readdir(dir)) != NULL) { /* if it's not a shared library, don't bother */ if ((len = is_shlib(name, ent->d_name)) < 0) continue; if (!nocache) cache_dolib(ent->d_name, len); /* have we already seen one with the same base name? */ for (lp = libs; lp; lp = lp->next) { if (strncmp(ent->d_name, lp->name, len+1) == 0) { /* we have, which one do we want to use? */ if (libcmp(&ent->d_name[len+1], &lp->name[len+1]) > 0) { /* let's use the new one */ free(lp->name); lp->name = xstrdup(ent->d_name); } break; } } /* congratulations, you're the first one we've seen */ if (!lp) { lp = xmalloc(sizeof *lp); lp->name = xstrdup(ent->d_name); lp->len = len; lp->next = libs; libs = lp; } } /* don't need this any more */ closedir(dir); /* now we have all the latest libs, update the links */ for (lp = libs; lp; lp = lp->next) link_shlib(name, lp->name, lp->len); /* always try to clean up after ourselves */ while (libs) { lp = libs->next; free(libs->name); free(libs); libs = lp; } return; } /* return the list of system-specific directories */ char *get_extpath(void) { char *cp = NULL; FILE *file; struct stat stat; if ((file = fopen(LDSO_CONF, "r")) != NULL) { fstat(fileno(file), &stat); cp = xmalloc(stat.st_size + 1); fread(cp, 1, stat.st_size, file); fclose(file); cp[stat.st_size] = '\0'; } return cp; } int main(int argc, char **argv) { int i, c, len; int nodefault = 0; int printcache = 0; char *cp, *dir; char *extpath; char defpath[] = DEFAULT_PATH; prog = argv[0]; opterr = 0; while ((c = getopt(argc, argv, "DvnNXlpf:S:")) != EOF) switch (c) { case 'D': debug = 1; /* debug mode */ nocache = 1; nolinks = 1; verbose = 1; break; case 'v': verbose = 1; /* verbose mode */ break; case 'n': nodefault = 1; /* no default dirs */ nocache = 1; break; case 'N': nocache = 1; /* don't build cache */ break; case 'X': nolinks = 1; /* don't update links */ break; case 'l': libmode = 1; /* library mode */ break; case 'p': printcache = 1; /* print cache */ break; default: fprintf(stderr, "usage: %s [-DvnNX] dir ...\n", prog); fprintf(stderr, " %s -l [-Dv] lib ...\n", prog); fprintf(stderr, " %s -p\n", prog); exit(EXIT_FATAL); break; /* THE REST OF THESE ARE UNDOCUMENTED AND MAY BE REMOVED IN FUTURE VERSIONS. */ case 'f': cachefile = optarg; /* alternate cache file */ break; case 'S': for (cp = optarg; *cp; cp++) { switch (*cp) { case 'C': sort_type = CTIME_SORT; /* sort by lib creation time */ break; case 'L': sort_type = LEN_SORT; /* sort by lib length */ break; case 'N': sort_type = NAME_SORT; /* sort by lib name */ break; case 'i': invert = -1; /* invert sort order */ break; default: error("invalid sort option -S%s", optarg); break; } } } /* allow me to introduce myself, hi, my name is ... */ if (verbose) printf("%s: version %s\n", argv[0], VERSION); if (printcache) { /* print the cache -- don't you trust me? */ cache_print(); exit(EXIT_OK); } else if (libmode) { /* so you want to do things manually, eh? */ /* ok, if you're so smart, which libraries do we link? */ for (i = optind; i < argc; i++) { /* split into directory and file parts */ if (!(cp = strrchr(argv[i], '/'))) { dir = ""; /* no dir, only a filename */ cp = argv[i]; } else { if (cp == argv[i]) dir = "/"; /* file in root directory */ else dir = argv[i]; *cp++ = '\0'; /* neither of the above */ } /* we'd better do a little bit of checking */ if ((len = is_shlib(dir, cp)) < 0) error("%s%s%s is not a shared library", dir, (*dir && strcmp(dir, "/")) ? "/" : "", cp); /* so far, so good, maybe he knows what he's doing */ link_shlib(dir, cp, len); } } else { /* the lazy bum want's us to do all the work for him */ /* don't cache dirs on the command line */ int nocache_save = nocache; nocache = 1; /* OK, which directories should we do? */ for (i = optind; i < argc; i++) scan_dir(argv[i]); /* restore the desired caching state */ nocache = nocache_save; /* look ma, no defaults */ if (!nodefault) { /* I guess the defaults aren't good enough */ if ((extpath = get_extpath())) { for (cp = strtok(extpath, DIR_SEP); cp; cp = strtok(NULL, DIR_SEP)) scan_dir(cp); free(extpath); } /* everybody needs these, don't they? */ for (cp = strtok(defpath, DIR_SEP); cp; cp = strtok(NULL, DIR_SEP)) scan_dir(cp); } if (!nocache) cache_write(); } exit(EXIT_OK); } typedef struct dirlist { short dirnamelen; long offset; char *entry; struct dirlist *q_forw; struct dirlist *q_back; } dirlist_t; typedef struct liblist { short libnamelen; short dirnamelen; long liboffset; long diroffset; char *entry; struct stat st; struct liblist *q_forw; struct liblist *q_back; } liblist_t; #define LINK_MASK 0xff static header_t magic; static dirlist_t *cur_dir = NULL; static liblist_t *cur_lib = NULL; void cache_dodir(char *entry, short len) { magic.ndirs++; if (cur_dir == NULL) { cur_dir = xmalloc(sizeof (dirlist_t)); cur_dir->dirnamelen = len; cur_dir->q_forw = NULL; cur_dir->q_back = NULL; cur_dir->offset = 0; cur_dir->entry = xstrdup(entry); } else { cur_dir->q_forw = xmalloc(sizeof (dirlist_t)); cur_dir->q_forw->dirnamelen = len; cur_dir->q_forw->q_forw = NULL; cur_dir->q_forw->q_back = cur_dir; cur_dir->q_forw->offset = cur_dir->offset + cur_dir->dirnamelen + 1; cur_dir->q_forw->entry = xstrdup(entry); cur_dir = cur_dir->q_forw; } } void cache_dolib(char *entry, short len) { char fullpath[PATH_MAX]; magic.nlibs++; if (cur_lib == NULL) { sprintf(fullpath, "%s/%s", cur_dir->entry, entry); cur_lib = (liblist_t *) xmalloc(sizeof (liblist_t)); cur_lib->libnamelen = strlen(entry)+(len<<8); cur_lib->dirnamelen = cur_dir->dirnamelen; cur_lib->diroffset = cur_dir->offset; cur_lib->liboffset = 0; stat(fullpath,&cur_lib->st); cur_lib->q_forw = NULL; cur_lib->q_back = NULL; cur_lib->entry = xstrdup(entry); } else { sprintf(fullpath, "%s/%s", cur_dir->entry, entry); cur_lib->q_forw = (liblist_t *) xmalloc(sizeof (liblist_t)); cur_lib->q_forw->libnamelen = strlen(entry)+(len<<8); cur_lib->q_forw->dirnamelen = cur_dir->dirnamelen; cur_lib->q_forw->diroffset = cur_dir->offset; cur_lib->q_forw->liboffset = cur_lib->liboffset + (cur_lib->libnamelen & LINK_MASK) + 1; stat(fullpath,&cur_lib->q_forw->st); cur_lib->q_forw->q_forw = NULL; cur_lib->q_forw->q_back = cur_lib; cur_lib->q_forw->entry = xstrdup(entry); cur_lib = cur_lib->q_forw; } } void cache_write(void) { int i, cachefd; char tempfile[1024]; void sort_cache(liblist_t *, int); if (!magic.nlibs) return; sprintf(tempfile, "%s~", cachefile); if ((cachefd = open(tempfile, O_RDWR|O_CREAT|O_TRUNC, 0666)) < 0) error("can't open %s (%s)", tempfile, strerror(errno)); lseek(cachefd, sizeof (header_t), SEEK_SET); sort_cache(cur_lib, magic.nlibs); while (cur_lib->q_back) cur_lib = cur_lib->q_back; for (i = 0; i < magic.nlibs; i++) { write(cachefd, cur_lib, sizeof (libentry_t)); if (cur_lib->q_forw == NULL) break; else cur_lib = cur_lib->q_forw; } while (cur_lib->q_back) cur_lib = cur_lib->q_back; for (i = 0; i < magic.nlibs; i++) { write(cachefd, cur_lib->entry, (cur_lib->libnamelen & LINK_MASK) + 1); if (cur_lib->q_forw == NULL) break; else cur_lib = cur_lib->q_forw; free (cur_lib->q_back->entry); free (cur_lib->q_back); } magic.diroffset = lseek(cachefd, 0L, SEEK_CUR); while (cur_dir->q_back) cur_dir = cur_dir->q_back; while (cur_dir) { write(cachefd, cur_dir->entry, cur_dir->dirnamelen + 1); if (cur_dir->q_forw == NULL) break; else cur_dir = cur_dir->q_forw; free (cur_dir->q_back->entry); free (cur_dir->q_back); } lseek(cachefd, 0L, SEEK_SET); memcpy(&magic, LDSO_CACHE_MAGIC LDSO_CACHE_VER, sizeof magic.magic + sizeof magic.version); magic.liboffset = sizeof (header_t) + magic.nlibs * sizeof (libentry_t); write(cachefd, &magic, sizeof (header_t)); close(cachefd); if (rename(tempfile, cachefile)) error("can't rename %s to %s (%s)", tempfile, cachefile, strerror(errno)); } void cache_print(void) { caddr_t c; struct stat st; int fd = 0; char nlibs; char *liboffset, *diroffset; libentry_t libent; if (stat(cachefile, &st) || (fd = open(cachefile, O_RDONLY))<0) error("can't read %s (%s)", cachefile, strerror(errno)); if ((c = mmap(0,st.st_size, PROT_READ, MAP_SHARED ,fd, 0)) == (caddr_t)-1) error("can't map %s (%s)", cachefile, strerror(errno)); close(fd); if (memcmp(((header_t *)c)->magic, LDSO_CACHE_MAGIC, LDSO_CACHE_MAGIC_LEN)) error("%s cache corrupt", cachefile); if (memcmp(((header_t *)c)->version, LDSO_CACHE_VER, LDSO_CACHE_VER_LEN)) error("wrong cache version - expected %s", LDSO_CACHE_VER); nlibs = ((header_t *)c)->nlibs; liboffset = c+((header_t *)c)->liboffset; diroffset = c+((header_t *)c)->diroffset; fprintf(stderr,"%d libs found in cache `%s' (version %s)\n", nlibs, cachefile, LDSO_CACHE_VER); for (fd = 0; fdentry, (*(liblist_t **)x)->entry); #else return invert * strncmp((*(liblist_t **)y)->entry, (*(liblist_t **)x)->entry, (*(liblist_t **)y)->libnamelen & LINK_MASK); #endif } static int liblencomp(const void *x, const void *y) { return invert * (((*(liblist_t **)y)->libnamelen & LINK_MASK) - ((*(liblist_t **)x)->libnamelen & LINK_MASK)); } static int libctimecomp(const void *x, const void *y) { return invert * (((*(liblist_t **)y)->st.st_ctime) - ((*(liblist_t **)x)->st.st_ctime)); } void sort_cache(liblist_t *cur_lib, int nlibs) { int i; char **array; while (cur_lib->q_back) cur_lib = cur_lib->q_back; array = (char **)malloc(nlibs * sizeof(char *)); for (i = 0; i < nlibs; i++) { array[i] = (char *)cur_lib; if (!cur_lib->q_forw) break; cur_lib = cur_lib->q_forw; } switch (sort_type) { case LEN_SORT: qsort(array, nlibs, sizeof (char *), liblencomp); break; case NAME_SORT: qsort(array, nlibs, sizeof (char *), libnamecomp); break; case CTIME_SORT: qsort(array, nlibs, sizeof (char *), libctimecomp); break; } while (cur_lib->q_back) cur_lib = cur_lib->q_back; /* Relink the sorted linked list and calculate the new offsets */ for (i = 0; i < nlibs; i++) if (i == 0) { ((liblist_t *)array[i])->q_back = NULL; ((liblist_t *)array[i])->q_forw = NULL; ((liblist_t *)array[i])->liboffset = 0; } else { ((liblist_t *)array[i-1])->q_forw = ((liblist_t *)array[i]); ((liblist_t *)array[i])->q_back = ((liblist_t *)array[i-1]); ((liblist_t *)array[i])->q_forw = NULL; ((liblist_t *)array[i])->liboffset = (long)((liblist_t *)array[i])->q_back->liboffset + ((long)((liblist_t *)array[i])->q_back->libnamelen & LINK_MASK) + 1; } cur_lib = (liblist_t *)array; free(array); } ld.so/ldd.1100644 147 456 2226 5442735441 11222 0ustar davidengr.\" Copyright 1992 David Engel (david@ods.com) .\" Copyright 1992 Rickard E. Faith (faith@cs.unc.edu) .\" Most of this was copied from the README file. Do not restrict distribution. .\" May be distributed under the GNU General Public License .TH LDD 1 "1 September 1993" .SH NAME ldd \- print shared library dependencies .SH SYNOPSIS .B ldd [ .B \-vV ] program ... .SH DESCRIPTION .B ldd prints the shared libraries required by each program specified on the command line. .PP Actually, .B ldd simply forks and execs each program with argc equal to zero. The startup code or dynamic linker, .BR ld.so , which normally loads the shared libraries, notices this special case and prints the dependencies. .SH OPTIONS .TP .B \-v Print the version number of .BR ldd . .TP .B \-V Print the version number of the dynamic linker, .BR ld.so . .SH BUGS .B ldd will .I not work with some extremely old programs which were linked before .B ldd support was added to the compiler releases. If you use .B ldd on one of these programs, the program will attempt to run with argc = 0 and the results will be unpredictable. .SH AUTHOR David Engel. .SH SEE ALSO .BR ldconfig (8), .BR ld.so (8). ld.so/ldd.c100644 147 456 5540 5454110056 11276 0ustar davidengr/* * ldd - print shared library dependencies * * usage: ldd [-vV] prog ... * -v: print ldd version * -V: print ld.so version * prog ...: programs to check * * Copyright 1993, David Engel * * This program may be used for any purpose as long as this * copyright notice is kept. */ #include #include #include #include #include #include #include #include #include "config.h" /* see if prog is a binary file */ int is_bin(char *argv0, char *prog) { int res = 0; FILE *file; struct exec exec; /* must be able to open it for reading */ if ((file = fopen(prog, "rb")) == NULL) fprintf(stderr, "%s: can't open %s (%s)\n", argv0, prog, strerror(errno)); else { /* then see if it's Z, Q or OMAGIC */ if (fread(&exec, sizeof exec, 1, file) < 1) fprintf(stderr, "%s: can't read header from %s\n", argv0, prog); else if (N_MAGIC(exec) != ZMAGIC && N_MAGIC(exec) != QMAGIC && N_MAGIC(exec) != OMAGIC) fprintf(stderr, "%s: %s is not {Z,Q,O}MAGIC\n", argv0, prog); else res = 1; /* looks good */ fclose(file); } return res; } int main(int argc, char **argv, char **envp) { int i; int vprinted = 0; /* this must be volatile to work with -O, GCC bug? */ volatile loadptr loader = (loadptr)LDSO_ADDR; while ((i = getopt(argc, argv, "vV")) != EOF) switch (i) { case 'v': /* print our version number */ printf("%s: version %s\n", argv[0], VERSION); vprinted = 1; break; case 'V': /* print the version number of ld.so */ if (uselib(LDSO_IMAGE)) { fprintf(stderr, "%s: can't load dynamic linker %s (%s)\n", argv[0], LDSO_IMAGE, strerror(errno)); exit(1); } loader(FUNC_VERS, NULL); vprinted = 1; break; } /* must specify programs is -v or -V not used */ if (optind >= argc && !vprinted) { printf("usage: %s [-vV] prog ...\n", argv[0]); exit(0); } /* print the dependencies for each program */ for (i = optind; i < argc; i++) { pid_t pid; char buff[1024]; /* make sure it's a binary file */ if (!is_bin(argv[0], argv[i])) continue; /* print the program name if doing more than one */ if (optind < argc-1) { printf("%s:\n", argv[i]); fflush(stdout); } /* save the name in the enviroment, ld.so may need it */ sprintf(buff, "%s=%s", LDD_ARGV0, argv[i]); putenv(buff); /* now fork and exec prog with argc = 0 */ if ((pid = fork()) < 0) { sprintf(buff, "%s: can't fork (%s)", argv[0], strerror(errno)); exit(1); } else if (pid == 0) { execl(argv[i], NULL); sprintf(buff, "%s: can't execute %s (%s)", argv[0], argv[i], strerror(errno)); exit(1); } else { /* then wait for it to complete */ waitpid(pid, NULL, 0); } } exit(0); } ld.so/preld.s100644 147 456 77 5442736661 11636 0ustar davidengr .text .globl __entry __entry: .space 32 jmp _shared_loader ld.so/testf.c100644 147 456 302 5377532407 11643 0ustar davidengr#include #include int main(void) { int i; printf("Testing ...\n"); for (i = 10; i >= 0; i--) printf("\t%g\n", pow(10.0, i)); printf("Boom!\n"); return 0; } ld.so/testi.c100644 147 456 245 5441225636 11647 0ustar davidengr#include int main(void) { int i; printf("Testing ...\n"); for (i = 10; i >= 0; i--) printf("\t%d\n", i); printf("Boom!\n"); return 0; } ld.so/vsprintf.c100644 147 456 12062 5524277532 12436 0ustar davidengr/* * vsprintf.c * * Copyright (C) 1991, 1992 Linus Torvalds and Lars Wirzenius * * Wirzenius wrote this portably, Torvalds fucked it up :-) */ #include #include #include /* we use this so that we can do without the ctype library */ #define is_digit(c) ((c) >= '0' && (c) <= '9') static int skip_atoi(const char **s) { int i=0; while (is_digit(**s)) i = i*10 + *((*s)++) - '0'; return i; } #define ZEROPAD 1 /* pad with zero */ #define SIGN 2 /* unsigned/signed long */ #define PLUS 4 /* show plus */ #define SPACE 8 /* space if plus */ #define LEFT 16 /* left justified */ #define SPECIAL 32 /* 0x */ #define SMALL 64 /* use 'abcdef' instead of 'ABCDEF' */ #if defined(__i386__) #define do_div(n,base) ({ \ int __res; \ __asm__("divl %4":"=a" (n),"=d" (__res):"0" (n),"1" (0),"r" (base)); \ __res; }) #elif defined(__mc68000__) #define do_div(n,base) ({ \ int __res; \ __asm__("divull %3,%1,%0":"=d" (n),"=d" (__res):"0" (n),"d"(base):"cc"); \ __res; }) #else # error This architecture not supported. #endif static char * number(char * str, int num, int base, int size, int precision ,int type) { char c,sign,tmp[36]; const char *digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i; if (type&SMALL) digits="0123456789abcdefghijklmnopqrstuvwxyz"; if (type&LEFT) type &= ~ZEROPAD; if (base<2 || base>36) return 0; c = (type & ZEROPAD) ? '0' : ' ' ; if (type&SIGN && num<0) { sign='-'; num = -num; } else sign=(type&PLUS) ? '+' : ((type&SPACE) ? ' ' : 0); if (sign) size--; if (type&SPECIAL) if (base==16) size -= 2; else if (base==8) size--; i=0; if (num==0) tmp[i++]='0'; else while (num!=0) tmp[i++]=digits[do_div(num,base)]; if (i>precision) precision=i; size -= precision; if (!(type&(ZEROPAD+LEFT))) while(size-->0) *str++ = ' '; if (sign) *str++ = sign; if (type&SPECIAL) if (base==8) *str++ = '0'; else if (base==16) { *str++ = '0'; *str++ = digits[33]; } if (!(type&LEFT)) while(size-->0) *str++ = c; while(i0) *str++ = tmp[i]; while(size-->0) *str++ = ' '; return str; } int vsprintf(char *buf, const char *fmt, va_list args) { int len; int i; char * str; char *s; int *ip; int flags; /* flags to number() */ int field_width; /* width of output field */ int precision; /* min. # of digits for integers; max number of chars for from string */ int qualifier; /* 'h', 'l', or 'L' for integer fields */ for (str=buf ; *fmt ; ++fmt) { if (*fmt != '%') { *str++ = *fmt; continue; } /* process flags */ flags = 0; repeat: ++fmt; /* this also skips first '%' */ switch (*fmt) { case '-': flags |= LEFT; goto repeat; case '+': flags |= PLUS; goto repeat; case ' ': flags |= SPACE; goto repeat; case '#': flags |= SPECIAL; goto repeat; case '0': flags |= ZEROPAD; goto repeat; } /* get field width */ field_width = -1; if (is_digit(*fmt)) field_width = skip_atoi(&fmt); else if (*fmt == '*') { /* it's the next argument */ field_width = va_arg(args, int); if (field_width < 0) { field_width = -field_width; flags |= LEFT; } } /* get the precision */ precision = -1; if (*fmt == '.') { ++fmt; if (is_digit(*fmt)) precision = skip_atoi(&fmt); else if (*fmt == '*') { /* it's the next argument */ precision = va_arg(args, int); } if (precision < 0) precision = 0; } /* get the conversion qualifier */ qualifier = -1; if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L') { qualifier = *fmt; ++fmt; } switch (*fmt) { case 'c': if (!(flags & LEFT)) while (--field_width > 0) *str++ = ' '; *str++ = (unsigned char) va_arg(args, int); while (--field_width > 0) *str++ = ' '; break; case 's': s = va_arg(args, char *); len = strlen(s); if (precision < 0) precision = len; else if (len > precision) len = precision; if (!(flags & LEFT)) while (len < field_width--) *str++ = ' '; for (i = 0; i < len; ++i) *str++ = *s++; while (len < field_width--) *str++ = ' '; break; case 'o': str = number(str, va_arg(args, unsigned long), 8, field_width, precision, flags); break; case 'p': if (field_width == -1) { field_width = 8; flags |= ZEROPAD; } str = number(str, (unsigned long) va_arg(args, void *), 16, field_width, precision, flags); break; case 'x': flags |= SMALL; case 'X': str = number(str, va_arg(args, unsigned long), 16, field_width, precision, flags); break; case 'd': case 'i': flags |= SIGN; case 'u': str = number(str, va_arg(args, unsigned long), 10, field_width, precision, flags); break; case 'n': ip = va_arg(args, int *); *ip = (str - buf); break; default: if (*fmt != '%') *str++ = '%'; if (*fmt) *str++ = *fmt; else --fmt; break; } } *str = '\0'; return str-buf; } int sprintf(char * buf, const char *fmt, ...) { va_list args; int i; va_start(args, fmt); i=vsprintf(buf,fmt,args); va_end(args); return i; } ld.so/strerror.c100644 147 456 3466 5515076602 12430 0ustar davidengr/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #ifndef HAVE_GNU_LD #define _sys_errlist sys_errlist #define _sys_nerr sys_nerr #endif #if NLS #include "../nls/nl_types.h" #endif /* Return a string descibing the errno code in ERRNUM. The storage is good only until the next call to strerror. Writing to the storage causes undefined behavior. */ char * DEFUN(strerror, (errnum), int errnum) { #if NLS libc_nls_init(); #endif if (errnum < 0 || errnum >= _sys_nerr) { static char unknown_error[] = "Unknown error 000000000000000000000"; static char fmt[] = "Unknown error %d"; #ifdef __linux__ sprintf(unknown_error, fmt, errnum); #else size_t len = sprintf(unknown_error, fmt, errnum); if (len < sizeof(fmt) - 2) return NULL; unknown_error[len] = '\0'; #endif return unknown_error; } #if NLS return catgets(_libc_cat, ErrorListSet, errnum +1, (char *) _sys_errlist[errnum]); #else return (char *) _sys_errlist[errnum]; #endif } ld.so/ld.so.conf100644 147 456 35 5525535215 12216 0ustar davidengr/usr/local/lib /usr/X386/lib ld.so/ldconfig100755 147 456 215304 5526032175 12150 0ustar davidengrdXH0-̀D$PO P7[̀/etc/ld.so.cache%s: warning: S\$\Rheh@D$PSh@hsh@ [%s: S\$\Rhh@UD$PSh@hsh@6 h7out of memorySD$uPh%Ãu h$y[ST$R;Ãu h$R[lib.so./%s%s%srbcan't open %s (%s), skippingcan't read header from %s, skipping%s is not a ZMAGIC file, skipping%s has a zero load address, skipping$UWVS$8D$$<jh$DR; 2h$@R;Ãj.CP:Ã$<R}ttPUht$$VhVǃu*R:PVhrWjj $ PjuVh?f$ tVh$(uVhD$Wj|$t +$<[^_]$%s%s%.*scan't stat %s (%s)can't unlink %s (%s)can't link %s to %s (%s) (changed) (SKIPPED) %.*s => %s%s UWVS$$R;t޿tPSh$P$R$R;t޿tPSh$S,D$PSHuYD$PP$SHt(R8PShp#fD$Pf9D$u D$T9D$u1=pD$P$SGu*ShHtR98PShU$S$R Ht4R8P$RSh=dtM|~P$R$R$Rh%[^_]ĀUVSBtAE Bt5j uVQ3j E Pu V39t7)ÉGUM 8t&EE M9uEU )Ѝe[^]%s: UWVS1=dtT$(Rh=lu#0|$(ЃPT$,RL$(QD$$|$ u(RD6PL$0Qh[^_]ÐT$ RGD$ |$|$ WL$,QrD$ |$|ă=luT$RWtft$FL$T$L L$VRW5 u/PL$Q0~ R!W+ [uAj ËD$ PL$ Kk݃T$ RtFFF [^_@UVS]%=u[%=tV1f;}/S.?%ށt%t@ttC?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~p r"s#VST$ RЉƉt)ډSރ[^h0‰0t]@PjR0@@84 Ð1UWVSL$Q"Ńu 1[^_]ÐT$+4y @9+4y @9~ 吐[4Vǃu'D$P1[^_]ÐVjW@P 0QW 50+4y @D Ѕ} @@ D=0VD$+4y @<[^_] UWVS\$ =uu1[^_] ÐtwFKFu@tjՋEM}t EMH+4y D@0DHDE%DyhŃ&D$9D$}D@L$ǐD$‹@ L$J@:tPD$9|$|ˉ+4y 0TR4L$ILL D$8[\9Z[4=<t_9<uUjЍS 49u9L$)Ή Pt0Z[4^D$ PcŃ+4y 0D@L$L[^_] Ë0[L$9 C -450[<L$9 >~SL$L$I >+L$ L>LL>LT>RD>@L$ 8LL+D>@L>LD>@T>8T0[L$L[^_] UWVS|$ T$ +4y rt$-0vD$L89~鐐RT9T$|%鐐RT~9T$RT 0R9D$u|$DT$5t$v|<ttT|$|D@|0t$v9Du#@D@DDD@t0D$~t|$lj9-<udjЍU 49uHt$)5< PЋ0D@||D@tt\\$|$=8[^_] Ð 4t$T5D$|$D$H9D5|<~r ٺ9T$~ B9T$Ct[Y0|$DH 4P[^_] Ð0t$v,|*t53|$ 7_;?tx0D([^_] Ð\$ D*%D*@;Ɓ@s@;tX[^_] UWVSl$$=\$\$T$+T$D$)9~N19}1\$)\$ʋ\\$D$ȋ\\\$\A9|)t$@19}'ʋ\\$D$ȋ\\\$\A9|\$9\$~9]+[^_]POSIXLY_CORRECT--%s: option `%s' is ambiguous %s: option `--%s' doesn't allow an argument %s: option `%c%s' doesn't allow an argument %s: option `%s' requires an argument %s: unrecognized option `--%s' %s: unrecognized option `%c%s' %s: illegal option -- %c %s: option requires an argument -- %c UWVS\$@=L$<9-uAL$-u߀~tً  T$49tL$840.uT595t&9tT$8R95u L$4  T$49u"9t5--D$84>-u~uX=u[^_] Ð5[^_] Ð݋L$,L$ D$( 1t ~-GT$8 T$84>-~-t |$H5D$(D$$1 F>t>=uD$,;t|+P QRl D$$ |$uJ+D$;0I9L$ u݋T$,T$ D$$D$,;u|$$te|$(u^=t&L$8PL$< Qh3.h@0=H?[^_] ÐT$ T$,C>}tF5H=t`D$8\{-u)mUL$< QhQ.h@{3mU\$T$RD$@Ph~.h@F0=H?[^_] Ð}L$49 }T$8u=t"D$8\SL$< Qh.h@0ۋ=ӉJ?D$<8:u:[^_] Ð0=H|$Dt T$,L$D}tEm (1[^_] ÐE [^_] Ð|$Ht8L$8x-t&  QT$@RD$ |$=tdL$8{-u&RD$<Ph.h@0 Q\$T$RD$@Ph.h@c/Q  L$ST$@R(Nj5>ut|$:u?=tSD$<Ph/h@?[^_] Ð::u >t 5}>t 5fL$49 uD=tST$<Rh,/h@`D$?D$<8:u&D$: T$8 D$[^_] jjjT$RT$RT$R+tT$P1ÐVSPt0{t1ɋC@ʃ|tGJ 9r{vJuhÃtA5P3PCC[^ÐD [^ÐC@DC[^1[^UWVSl$=PtS_KtA[4t ~ tJQUBЃBЉ؃Kuɋ?u]U(UWVS|$ |$T$)T$l$D$ ƋT$(RT$(RT$(RWT$(RT$C CCftCCCCXCS CCSGftSSSC SSCCC CC uC+CP{WSLsC 9CuC+CP{WS' t2CCu Ct( u#C+CP{WSu %e[^_]US]C9C{u S'Cut*S# K<SC )PRApPAtЉ…u  1ҋCC CЉCCCCCu {H|SHC]]UWVS]uu 1Ct CH4KC9t)S}EUZ+ZBt%BtZ E+X9|9v I9 t9w~U9~~#SVURR -E@EK|EF@EIyUZ)߉E~kjEPEtUUJ +J~ 1ۉ)؉EPVURlE t߅tWuuVEPE)NjE)e[^_]UURU RUR ]äUWVSu} F^)tVHJtuF+FÅ|9vNىN؍e[^_]UUE tt ]ÐPR]U]WVSt$0Ѝx;t3WVR蚧 u<=uG[^_Ð;u1[^_U0WVS}E$)ĉ]} .} E HE9+1uEƋWV]Ӄ}#}ABuVW]Ӄ}\}ABuWV]Ӄ}$}ABu}WVSդ ]+uWS}׃}}ِVS}׃} +u琐9s8]򐐐ABu}) 9th9`+9rl+9rH]+u딋h+9sL9~(;s&_9`E HE9v‰}9w:VS}׃}]9v9t#}ABu}]߉9+uVW]Ӄ|u9tJ]L;9r9ʉ+E9sI9vʋ}9s[^_]$ jD$PjT jAtj胴WT$t'D$ |$tO_Ð1_WVS\$T$ߋt$)9r'v؃)‰<։׃v))ONON[^_WVSt$\$1Iʬt ߉uN1[^_ÃWVS\$1|$Iʬt |$tN)މt$ D$ [^_WVS\$t$|$…tvt1tIt+9 P!P 6V<ƒ![^_Ðt1[^_øD̀SE\$̀[UE} tGƒ@ @@@@@ @ @@@ p]UExt1]Ðxt @PQ!]UU@ `tR"]UE]US]M B9Bw%PRB؋]]US]M B9Bw%PRB؋]]UURU RUR!]US]M B9Bw%PRwB؋]]UURU RUR!]UURU RURl!]UE PUR/]UE PUR]UU RUR]UU RUR]UE PURo]UE PUR]UE $UR+]UE URЉ]US]E RЉ؋]]UVS]u u1@pt:u 1 Afy |9tPxt @P!@ tS]]UEztJ1]ÐztH+Hȅu RR]U]UVSuztJ[ztH+Hȅu RRSC9CwSu CCuHЍe[^]UE@]US]E zuPR.u@؋]]US]xuPEu@؋]]US]E zuPRu@؋]]UU RUR]UU RURp]UU RUR]UU RUR]US]E RЉ؋]]UE URЉ]UVS]u u1@`t:u 1 Afy |9tPFRVe0$p@u uM AIBЃ wE3BwZɉ]BEwJM9}|RV}tyEȉڋ] s3RP]MM]EU] SF9FwVu@FF.MH]H1e[^_]U VS]u EPEPS$t}t ]U]fUf؍e[^]U VS]u EPEPSt}t ]U]fUf؍e[^]U VS]u EPEPSt}t ]U]U؍e[^]U VS]u EPEPSDt}t ]U]U؍e[^]U VS]u EPEPSt}t ]U]U؍e[^]U VS]u EPEPSt}t ]U]U؍e[^]U VS]u EPEPSt}t ]U]UMN؍e[^]U VS]u EPEPS4t}t ]U]UMN؍e[^]%lgUS]xtHSxt @Pa @ tS tU RhfS؋]]%gUS]xtHSxt @P @ tS tU RhSH؋]]UWVS}u xxt @Pi @ tW H}tlC9CwSu CCtV9Vw%PVF%uHe[^_]UVS]M MxuLxt @P uB9Bw%PRB@ `tS ؍e[^]0123456789ABCDEF0X0123456789abcdef0xU8WVS] u}EM@ Eȃp u$O$ 0uu@u`ԵMtO؃uucOjj VS$[0jj VSXÉօw׉ؐO 10u}~M@ tE)EԋMP@EE؃}}@19)ƋMH MЊ@E̅~ttVPS }}C9Cwj-"-.}t C9Cwj+S +C1ɅtCNx;UC9Cw$PSU3UCNy̋M@ `tQEe[^_]%pUS]xu2xt @PU Rh6S @ `tSO؋]]UWVS}u xxt @PIF9FwV螻u FFt7S9Sw%PS*C%uH@ `tWe[^_]USUM} tSBB uBB@]X@@ @ @B pH Ћ]]UVS]HEE}guEeuM uEEgEu }tEEPEPEPSURu u5EċM)Mm}u]}tr}'tiEH}gt}Fu |9|P|E+E-ؐM UU0M I0IUIMUȈ+MM}u}tE}'uUU1EE}uZ}fu]M9M}6+E)E,}uU9U|+]+]]}}E}uM9M}E}u"}%؉Ã-=}+u+}t- }t-t UMDEEEEEU9U~E)E"} E@+EEE9E~M)M}~)}t#}tuUREPW轴 t;G9Gw%PWxG%LF}u#}~uMQEPWU "}U9U0]ދO|e[^_]UWVS] DžDžDžDžDž1AptU]C9CwS軮u MA0AptP봐%GDž1ҋ3Cx$TVMQ6DD$DGt]C9Cw%SuDžxMAxAx 9xtxSMQ衳 =- tFЉDž@DžDžl:DžfDžl:9~ QP| |  1Džl:Dž/t"E]CffE]CDž ptDž@Dž ]C9Cw.S|芩|uMAN ]CxxHtr]C@C9Cw/S| |uDžxMAxx xXu$tu Džtx1MI]+Kx9}8)ˉ]KS<BPB Ѓu ]K EMQދU}TG~e[^_]UWVS]} E 1Ҹ~B9R‹MJB  ~/ PCj Rƒ F9|C5 !PCj Rƒ F9uЍe[^_]UU1uuuu|@@u ]UMtCt1]Ðt]Ð]Ð1fuuuuu@u ]Ð]US]jX@]]U4WVS]u C9F~]uCSUNMʉU9S}@PEǃUU9s9}w]M Mu܋UU؋MM9UUt]}]EE EEЉUE ȉփUfsfMf 9}wU܋ Mt`}]E3EEEЉMfUfSf3E ȉuU9}w3EEM9MUM\~ M}~;tUMQEe[^_]UWVS} tjTPUR}E tr5uhqtVURËUR] t%uVV뽐Ee[^_]UWVS] }wOAMG9~ F9EV*Eǃ}19}MM@9|U}ЉEe tB +u 1ۋM ؋}}9Uwމt%E }}9UwMI}O}WEe[^_]UVSMu VA)uAYD0 9t9v9w1e[^]UWVSuU RVÃu!jE@@}uu }}  1ۋVREX ~}U} }U REM1ې}?)؉EU:)؃UfAfUf}9}r9uv@؉E؃fAfUf9uwM9t}UzEe[^_]UE %~MEs؉"UEFE!)ʉѺUEE]UWVSEPU@tSǺ )M  I ) ?E9usF1O ) 9us MEtT] )U ? ؉E9us^ 1ۋU ) ?]UUEe[^_]UWVSjǍWUM Me u utMEEtdEPÃt" )؋u EGm uwEUBEtEMOM)EPËuwGE }t%UM5)ڋu0MuUtVU)‹Me[^_]UVSu] EPV]EPS]U+UF+CЅ~E)EEue[^]@?5?55?5?UWVSEEEEEUU-E9$X*HHHHHHHH88888HHHHHHHHHHHHHHHHHH8HHHHHHHHHHHEEU:uEEU:0u'EBU:0u EE80tU:N EE11E1/ |A\AFEU /~9~Љuȃ.EEuG0uEEU 0tAσEEUUEAЃ EtnEEDž|9|}1F |U9||ωF ~3jMQEURPƃ uEԨt Eԃ}:tM'~<}9uE9@E%MU BUgEԋMAMU9Ujj EP[E M9Mujj QCEE +jj UR#Ejj EPEEiEMQUR;0EԊMԋU BUE9E}jj MQE E뾐jUREEPMQà uJUtBME89uM9MtMU:9tE@E0EċM1AMMU:0u ME80tEMQ}t8}tU9Ut EPMQ؋UREUBM} tM E\[^_]UWVS}MMGztJztH+Hȅu RR賵jEPMQM QSCƋEH9u HXC9CwSnu CCuH E9uF Svwe[^_]UWVS}MMGztJztH+Hȅu RRôjEPMQM QSSƃ|)u not found %s: can't find library '%s' %s (%s) => %s %s: using incompatible library '%s' Desire minor version >= %d and found %d %s: incompatible library '%s' Require major version %d and found %d dynamic linker error in%s: %s fixup pass 1 %s: %s resolve pass %s: %s fixup pass 2 %s: %s reset pass U4WVSUDž$Dž )bp5-bt1bxf 5bf|tWt!tEyh7bh=bhHbj u VQDžE P-Mu50bEM$Rh=bhXbjn hh~bz% hb]%u!hb7u Dž=bhb8C!ft, f9u ! f9tf0ҋ҉փ)PQPuV$PQ$lPhbjjhb à |h,VS@$)ĉ@QVS S@0VMQ$VP$ pQuV$PQ$ x_( 6Fj/Q%tu  69/u5QVjV 119$~5QtVPQƒC79$˅'0Ӊfff1ۋI 9Džf 0ff9FDu?PqtVVP`ƒ CI 91F1N 9}SVPQVƒC0u}v 9|ukt2 HQVhbj{PQhbjfht7V HQVhbj!  H Q6Vƒt tw PQhbjйd1S 6V 1Sh9bj lQVhcbjVfHQ 6fF%Phbj' h  9tlVP ,bjPt.Q,VhbjhPt'Q,Vhbj=hjPnt%Q,VhbjhPt'Q,VhbjhS[^_]%s: can't map cache '%s' ld.so-%s: cache '%s' is corrupt %s: cache '%s' has wrong version @UWVSl$XD$Phbujhbƃ} 1[^_]@ËT$$UjVjjRjZÃu0hbh=bh bjV1[^_]@ÐV޿ b1t FO)ȃt6hbh=bh bjpmUS1[^_]@Ðs7bthbh=bh! b봐[^_]@VSt$ F8u1[^Ð8t[^xD PKu҅}1[^UWVS\$S|$9u1[^_]Ð9t[^_]Ð3x"|$WD PNuÅ}S:lt`19u~Y||$?tDL$1ې|$u|$D;)|$D;9uF9u1[^_]VSt$ F8u1[^Ð8t[^xD PKu҅}1| tD L CN9C#TDN91[^WVS$$P$R\$SVSW[^_S\$1LB< v[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz8UWVSL$L\$Xl$`D$b@tD$btD$T"v1[^_]8ÐD$ tD$ 0t|$P}D$-\$P)u$ D$ D$+|$tK t#|$Tu|$TuK1|$PuD$$0&D$P1ҋ|$TD$PD$D4$F|$Pu9t$\}t$\+\$\u  AK|$tD$A t$|$Tu0|$Tu0AT$R!Au'K~ D$ A\$K|$ 0AD$\L$\9|N~T4$At$N|$ AK[^_]8UWVSt$8%1D$ @D$ $|bbbbbbbbbbbbbbbbb b놐sc SCT$ < wD$ PÃ(:*uD$$L$$Y}ۃD$D$ 8.uID$ T$ < wD$ P;D$:*uD$$|$$|$|$}D$D$ 8ht 8lt8LuD$ D$  !$bb b b b b b b b b b bbb b b b bb b b b bb|bb b bb bb b bbu  FKD$$FL$$IKq FKbD$$|$$|$0T$Љƒ|$| 9T$}T$u FK9|19}L$ D$F@9|K9 FK9|U|$WSjAuU|$WSj$@U|$WSjU|$WSj D$4L$4IQVqƃND$$|$$G+L$.D$ 8%t%FD$ 8t FL$ D$ D$ 8 +D$[^_]D$ PT$ RT$ R ËD$|9<&b Ph41bh1b1b ÐP$bWVSt$0Ѝx0b;t3WVRr u<=uG[^_Ð;u1[^_WVT$ t$1Ou^_S\$T$ )ЍHBu[WV|$ t$L$AItuu1 r^_V1ҋt$D$ Ĭ8uJu^WVS\$|$u'=H1bu0b1[^_ÐH1bWSÃ;uH1b1[^_ÐWV[ÃuH1b CH1b[^_Unknown errorOperation not permittedNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesTry againOut of memoryPermission deniedBad addressBlock device requiredDevice or resource busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeMath argument out of domain of funcMath result not representableResource deadlock would occurFile name too longNo record locks availableFunction not implementedDirectory not emptyToo many symbolic links encounteredOperation would blockNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedInvalid exchangeInvalid request descriptorExchange fullNo anodeInvalid request codeInvalid slotFile locking deadlock errorBad font file formatDevice not a streamNo data availableTimer expiredOut of streams resourcesMachine is not on the networkPackage not installedObject is remoteLink has been severedAdvertise errorSrmount errorCommunication error on sendProtocol errorMultihop attemptedRFS specific errorNot a data messageValue too large for defined data typeName not unique on networkFile descriptor in bad stateRemote address changedCan not access a needed shared libraryAccessing a corrupted shared library.lib section in a.out corruptedAttempting to link in too many shared librariesCannot exec a shared library directlyIllegal byte sequenceInterrupted system call should be restartedStreams pipe errorToo many usersSocket operation on non-socketDestination address requiredMessage too longProtocol wrong type for socketProtocol not availableProtocol not supportedSocket type not supportedOperation not supported on transport endpointProtocol family not supportedAddress family not supported by protocolAddress already in useCannot assign requested addressNetwork is downNetwork is unreachableNetwork dropped connection because of resetSoftware caused connection abortConnection reset by peerNo buffer space availableTransport endpoint is already connectedTransport endpoint is not connectedCannot send after transport endpoint shutdownToo many references: cannot spliceConnection timed outConnection refusedHost is downNo route to hostOperation already in progressOperation now in progressStale NFS file handleStructure needs cleaningNot a XENIX named type fileNo XENIX semaphores availableIs a named type fileRemote I/O error,b:bRblb|bbbbbbbb bb)b5bKbcbobbbbbbbbbbb/b<bRbabmbbbbbbb'bKbab|bbbbbbbb2bAbRbmb{bbbbbbbb b$bBbXbibbbbbbbbb'bBb_bvbbbb b8 bN bz b b b b b b!b!b6!bP!b~!b!b!b!b!b "b#"bO"bp"b"b"b"b"b#b@#bU#bh#bu#b#b#b#b#b#b $b'$b<$bzS!\$L$ ̀} أ0b[S\$̀} أ0b[Sl\$L$ ̀} أ0b[2̀} أ0bø1̀} أ0bS/\$̀} أ0b[S\$̀} أ0b[S\$L$ T$̀} أ0b[S\$L$ T$̀} أ0b[Sj\$L$ ̀} أ0b[S\$L$ T$̀} أ0b[S[\$L$ ̀} أ0b[SV\$̀} أ0b[VST$0L$4t$<\$(\$ D$,D$T$L$\$8\$t$ T$ Z̀=w ډ0b[^WVSt$\$1Iʬt ߉uN1[^_ÃWVS\$1|$Iʬt |$tN)މt$ D$ [^_(((((AAAAAABBBBBBUnknown error 000000000000000000000Unknown error %dld.so/libldso.a100644 147 456 115542 5526032320 12222 0ustar davidengr! __.SYMDEF/ 760755408 0 0 666 301 ` xrrr/9CLV9TV9[>eH~_______reset_magic___do_fixups___dynamic_resolve_fdprintf_vsprintf_sprintf__ctype__ctmp_strerror___load_shared_libraries_errno___environ_exit_shared_loader__entryfixups.o/ 760755380 100 100 100644 3917 ` d<UEP:u 1EP:t{EPEM}|CEUD  QMt,Ő1 ]UWVSUB} 9u1UB} 9tEPE8}}|G} WEUD :WMltIUBUJэ|}}EEU9EEU|}EUэ<u } uJEUэDUMˍ TM]ލ :+98HEUэDUMˍ TM]ލ :98EKE1 e[^_]UVSEP:u 1SEP:t8EPE0u}|GEUD 2VMtEEPE9~\UBUэ|uAUBUэDMQMˍ t0E뤐EEPE9~@UBUэDMQMˍ T20E뻐1 e[^]%d<dEgy_}C^zWN}DDADBDGDI DJ.DL@DNLDQWDR]DS}DUDVDV$A@BDYDZDcDfDgDi Dl(Do3Dp9Dq]DtDDDDDDDD@D~DDDDDD$YXX Z[ $,-./DDDDDDDDDD9D`DtDDDDDDD D0D0B$W`gh0igcc2_compiled.___gnu_compiled_c/home/david/src/ld.so/fixups.cint:t1=r1;-2147483648;2147483647;char:t2=r2;0;127;long int:t3=r1;-2147483648;2147483647;unsigned int:t4=r1;0;-1;long unsigned int:t5=r1;0;-1;long long int:t6=r1;01000000000000000000000;0777777777777777777777;long long unsigned int:t7=r1;0000000000000;01777777777777777777777;short int:t8=r1;-32768;32767;short unsigned int:t9=r1;0;65535;signed char:t10=r1;-128;127;unsigned char:t11=r1;0;255;float:t12=r1;4;0;double:t13=r1;8;0;long double:t14=r1;12;0;complex int:t15=s8real:1,0,32;imag:1,32,32;;complex float:t16=r16;4;0;complex double:t17=r17;8;0;complex long double:t18=r18;12;0;void:t19=19ptrdiff_t:t1size_t:t4wchar_t:t3fixuplist:T20=s16size:1,0,32;magic:21=*1,32,32;\list:22=*23=xsimage_fixuplist:,64,32;shrlib_list:24=ar1;0;0;25=*26=*27=*20,96,32;;elemental_fixup:T28=s8un:29=u4newaddr:1,0,32;\bifu:30=*31=xsbuiltin_fixup:,0,32;;,0,32;fixaddr:21,32,32;;image_fixuplist:T23=s12size:1,0,32;fix:32=ar1;0;0;28,32,64;;builtin_fixup:T31=s8len:1,0,32;fixpnt:33=ar1;0;0;34=*35=xsfile_fixup:,32,32;;builtin_elemental_fixup:T36=s8gotaddr:21,0,32;fixaddr:21,32,32;;file_fixup:T35=s8fixup:37=ar1;0;0;36,0,64;;___reset_magic__reset_magic:F1xpnt:p27size:1___do_fixups__do_fixups:F1xpnt:p27flag:p1size:1bpnt:30i:1fpnt:34___dynamic_resolve__dynamic_resolve:F1xpnt:p27size:1 fdprintf.o/ 760755383 100 100 100644 3518 ` dTUEEURU RP EURPUR E ];_ ] %d<dGi{aE`|6D 7$^'i(t)*+,-./<=>AB 8OEO&cHR]j!s"|#$(*+,-.123478 9:<&>/?:@FhVsDD D DD+DBDPDP$   4 5P6gcc2_compiled.___gnu_compiled_c/home/david/src/ld.so/fdprintf.cint:t1=r1;-2147483648;2147483647;char:t2=r2;0;127;long int:t3=r1;-2147483648;2147483647;unsigned int:t4=r1;0;-1;long unsigned int:t5=r1;0;-1;long long int:t6=r1;01000000000000000000000;0777777777777777777777;long long unsigned int:t7=r1;0000000000000;01777777777777777777777;short int:t8=r1;-32768;32767;short unsigned int:t9=r1;0;65535;signed char:t10=r1;-128;127;unsigned char:t11=r1;0;255;float:t12=r1;4;0;double:t13=r1;8;0;long double:t14=r1;12;0;complex int:t15=s8real:1,0,32;imag:1,32,32;;complex float:t16=r16;4;0;complex double:t17=r17;8;0;complex long double:t18=r18;12;0;void:t19=19__gnuc_va_list:t20=*19va_list:t20__long_double_t:t14__u_char:t11__u_short:t9__u_int:t4__u_long:t5__quad:t21=s8val:22=ar1;0;1;3,0,64;;__u_quad:t23=s8val:24=ar1;0;1;5,0,64;;__dev_t:t9__gid_t:t9__uid_t:t9__mode_t:t9__daddr_t:t3__off_t:t3__ino_t:t5__nlink_t:t9__time_t:t3__pid_t:t1__ssize_t:t1__fsid_t:t21__caddr_t:t25=*2__swblk_t:t3__fd_set:T26=s32fds_bits:27=ar1;0;7;5,0,256;;__fd_set:t26size_t:t4 :T28=e_SC_ARG_MAX:0,_SC_CHILD_MAX:1,_SC_CLK_TCK:2,\_SC_NGROUPS_MAX:3,_SC_OPEN_MAX:4,_SC_STREAM_MAX:5,\_SC_TZNAME_MAX:6,_SC_JOB_CONTROL:7,_SC_SAVED_IDS:8,\_SC_VERSION:9,_SC_CLOCKS_PER_SEC:10,_SC_BC_BASE_MAX:11,\_SC_BC_DIM_MAX:12,_SC_BC_SCALE_MAX:13,_SC_BC_STRING_MAX:14,\_SC_COLL_WEIGHTS_MAX:15,_SC_EQUIV_CLASS_MAX:16,_SC_EXPR_NEST_MAX:17,\_SC_LINE_MAX:18,_SC_RE_DUP_MAX:19,_SC_2_VERSION:20,\_SC_2_C_BIND:21,_SC_2_C_DEV:22,_SC_2_FORT_DEV:23,\_SC_2_FORT_RUN:24,_SC_2_SW_DEV:25,_SC_2_LOCALEDEF:26,;time_t:t3clock_t:t3ptrdiff_t:t1pid_t:t1uid_t:t9gid_t:t9dev_t:t9ino_t:t5mode_t:t9umode_t:t9nlink_t:t9daddr_t:t1off_t:t3u_char:t11u_short:t9u_int:t4u_long:t5unchar:t11ushort:t9uint:t4ulong:t5caddr_t:t25cc_t:t11speed_t:t4tcflag_t:t5fd_set:T29=s32fds_bits:27,0,256;;fd_set:t29ustat:T30=s20f_tfree:1,0,32;f_tinode:5,32,32;\f_fname:31=ar1;0;5;2,64,48;f_fpack:31,112,48;;fd_mask:t5_fdprintf_vsprintf_writefdprintf:F1fd:p1fmt:p32=*2args:20i:1buf:33=ar1;0;1023;2vsprintf.o/ 760755389 100 100 100644 6691 ` d h UVSEE:/~7E:9-E ʋEڍrЉuƐE e[^]0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzU@SEiU@UȀ}tEԎ]]Ȁ}te}~}$ 1E$EȀ}tE0E UȈU]]Ȁ}t} }E-] RE$EȀ}u2UUȀ}tE EE+]Ȉ]}tME$ EȀ}t}u E }uME} uU؉Uċ]]Љ]E0E@} t:U؉U]]Љ]ċE 1ҋ]E ŰEẺEU]ĈEÐ]Љ]ċE9E}UЉU])]E$EĀ}u(UUM}~]]ċE E}tUUĊ]EĈEU UĀ}tK}u]]ċE0E4}u+UUċ]0EEEċUԃ!U]EĈEE$EĀ}u1UUM}~"]]ĊEUĈEސ]]ME9E}UUċ]0EސEЉEMЃ}~!UUč]؉]MMЊUĈEӐ]]M}~EEċU EE ]]U$MME 87E 8%tEU E EE E º9`M끐MnM^M NM>EE 8/~!E 89E PE*E 8*uEEM}}]MEE 8.uQE E 8/~"E 89E PEE 8*uEEM}}EEE 8htE 8ltE 8Lt E ME E ¨º 9TPE$uM}~E E쐐EEEU M}~E E쐐;EEMMQE}} MME9E}MME$uEM9E}E EꐐEE9E~!EU EEE㐐EM9E}E Eꐐ{MQMQMQjEEQMQE?}u EMMQMQMQjEEQMQEM@MQMQMQjEEQMQHEMMQMQMQj EEQMQEnEEMEM+MDE 8%t E%EE 8tEU E M E EU+U]UEEURU RURs EE] |xtplhd`\XTPLHD@<840,($ |xtplhd`U%d<dGi{aE`|6DDDDD#DPD`D`$`D1D2D3D6D7D8D9D: D;JD<_D=cD>fD?pD@DADBDCDDDEDFDGDH%DIPDJdDKjDLxDMDNDODPDQDRDSDTDUDWDXDY.DZPD[aD\D]D^D_D`DaDa$1,/4/ ;/C/K0X0`2d2k2}34H%5DdDeDrDs DtDuDy0D{7D|:D}D~DDDDDDD0D8DGDMDPDTD[DcDfDvDDDDDDDDDDDDDDDDDDDD$D0D8D>DGDRD`DoDDDDDDDDD DD=DPDTDDDDDDDDDD D D D# Dr0 D@ DF DP DP $dcc cefghikmnpP ` D` Df Df Dl D D D &$` 19 AIMf N Ogcc2_compiled.___gnu_compiled_c/home/david/src/ld.so/vsprintf.cint:t1=r1;-2147483648;2147483647;char:t2=r2;0;127;long int:t3=r1;-2147483648;2147483647;unsigned int:t4=r1;0;-1;long unsigned int:t5=r1;0;-1;long long int:t6=r1;01000000000000000000000;0777777777777777777777;long long unsigned int:t7=r1;0000000000000;01777777777777777777777;short int:t8=r1;-32768;32767;short unsigned int:t9=r1;0;65535;signed char:t10=r1;-128;127;unsigned char:t11=r1;0;255;float:t12=r1;4;0;double:t13=r1;8;0;long double:t14=r1;12;0;complex int:t15=s8real:1,0,32;imag:1,32,32;;complex float:t16=r16;4;0;complex double:t17=r17;8;0;complex long double:t18=r18;12;0;void:t19=19__gnuc_va_list:t20=*19va_list:t20__long_double_t:t14size_t:t4_skip_atoiskip_atoi:f1s:p21=*22=*2i:1_numbernumber:f23=*2str:p23num:p1base:p1size:p1precision:p1type:p1c:2sign:2tmp:24=ar1;0;35;2digits:22i:1__res:1_vsprintf_strlenvsprintf:F1buf:p23fmt:p22args:p20len:1i:1str:23s:23ip:25=*1flags:1field_width:1precision:1qualifier:1_sprintfsprintf:F1buf:p23fmt:p22args:20i:1 ctype.o/ 760755391 100 100 100644 1342 ` dD(((((AAAAAABBBBBB%d<dDfx^|B]y  gcc2_compiled.___gnu_compiled_c/home/david/src/ld.so/ctype.cint:t1=r1;-2147483648;2147483647;char:t2=r2;0;127;long int:t3=r1;-2147483648;2147483647;unsigned int:t4=r1;0;-1;long unsigned int:t5=r1;0;-1;long long int:t6=r1;01000000000000000000000;0777777777777777777777;long long unsigned int:t7=r1;0000000000000;01777777777777777777777;short int:t8=r1;-32768;32767;short unsigned int:t9=r1;0;65535;signed char:t10=r1;-128;127;unsigned char:t11=r1;0;255;float:t12=r1;4;0;double:t13=r1;8;0;long double:t14=r1;12;0;complex int:t15=s8real:1,0,32;imag:1,32,32;;complex float:t16=r16;4;0;complex double:t17=r17;8;0;complex long double:t18=r18;12;0;void:t19=19__ctype_ctype:G20=ar1;0;-1;11_ctmp:G2__ctmpstrerror.o/ 760755393 100 100 100644 2429 ` dT8l0U}|E9~ *MQhxhT TU]Unknown error 000000000000000000000Unknown error %dF> 7/: *%7 %d<dGi{aE`|D     $0@O\iuIN8kkTxD%D*D, D/ D66D7@D;@D=PD=P$%$&,T&-x2 3@4P5gcc2_compiled.___gnu_compiled_c/home/david/src/ld.so/strerror.cint:t1=r1;-2147483648;2147483647;char:t2=r2;0;127;long int:t3=r1;-2147483648;2147483647;unsigned int:t4=r1;0;-1;long unsigned int:t5=r1;0;-1;long long int:t6=r1;01000000000000000000000;0777777777777777777777;long long unsigned int:t7=r1;0000000000000;01777777777777777777777;short int:t8=r1;-32768;32767;short unsigned int:t9=r1;0;65535;signed char:t10=r1;-128;127;unsigned char:t11=r1;0;255;float:t12=r1;4;0;double:t13=r1;8;0;long double:t14=r1;12;0;complex int:t15=s8real:1,0,32;imag:1,32,32;;complex float:t16=r16;4;0;complex double:t17=r17;8;0;complex long double:t18=r18;12;0;void:t19=19__long_double_t:t14_G_clock_t:t3_G_dev_t:t9_G_fpos_t:t3_G_gid_t:t9_G_ino_t:t5_G_mode_t:t9_G_nlink_t:t9_G_off_t:t3_G_pid_t:t1_G_ptrdiff_t:t1_G_sigset_t:t4_G_size_t:t4_G_time_t:t3_G_uid_t:t9_G_wchar_t:t3_G_int32_t:t1_G_uint32_t:t4_G_ssize_t:t1_G_va_list:t20=*19size_t:t4fpos_t:t3__FILE:T21=s40_flags:1,0,32;_gptr:22=*2,32,32;\_egptr:22,64,32;_eback:22,96,32;_pbase:22,128,32;\_pptr:22,160,32;_epptr:22,192,32;_base:22,224,32;\_ebuf:22,256,32;_chain:23=*24=xsstreambuf:,288,32;;FILE:t21_unknown_error.2_fmt.3_strerror_sys_nerr_sprintf_sys_errliststrerror:F22errnum:p1unknown_error:V25=ar1;0;35;2fmt:V26=ar1;0;16;2 __load.o/ 760755397 100 100 100644 5865 ` d HUS]̀E}|E!Eأ ]]USV]̀E}|E!Eأ ]]US]M ÙE}|E+Eأ ]]US[]M ̀E}|E.Eأ ]] statically linked UWV=t?hhMQE Q}PE)E}W}jEPj }j e^_]   z 6v&%d<dEgy_}C^zD $9'D(O)Z*f+s,~-./<=>ABO *_>#-8E!N"W#`$i(r*|+,-.1234789:<> ?@!CVN}6$8s#* G  B &@    DCDCDC@ $C C# C+ , @- PDFPDFWDF5 $FP? FO FW WX Y DIDIDI` $Ii Io I { I I DLDLDLP $L L L L  P pDSpDTx Dm  DpDsDuDvDwDxDyDzDz $Sp+ R3 R @ RI xJ K L s^ _ ` a gcc2_compiled.___gnu_compiled_c/home/david/src/ld.so/__load.cint:t1=r1;-2147483648;2147483647;char:t2=r2;0;127;long int:t3=r1;-2147483648;2147483647;unsigned int:t4=r1;0;-1;long unsigned int:t5=r1;0;-1;long long int:t6=r1;01000000000000000000000;0777777777777777777777;long long unsigned int:t7=r1;0000000000000;01777777777777777777777;short int:t8=r1;-32768;32767;short unsigned int:t9=r1;0;65535;signed char:t10=r1;-128;127;unsigned char:t11=r1;0;255;float:t12=r1;4;0;double:t13=r1;8;0;long double:t14=r1;12;0;complex int:t15=s8real:1,0,32;imag:1,32,32;;complex float:t16=r16;4;0;complex double:t17=r17;8;0;complex long double:t18=r18;12;0;void:t19=19__long_double_t:t14__u_char:t11__u_short:t9__u_int:t4__u_long:t5__quad:t20=s8val:21=ar1;0;1;3,0,64;;__u_quad:t22=s8val:23=ar1;0;1;5,0,64;;__dev_t:t9__gid_t:t9__uid_t:t9__mode_t:t9__daddr_t:t3__off_t:t3__ino_t:t5__nlink_t:t9__time_t:t3__pid_t:t1__ssize_t:t1__fsid_t:t20__caddr_t:t24=*2__swblk_t:t3__fd_set:T25=s32fds_bits:26=ar1;0;7;5,0,256;;__fd_set:t25size_t:t4 :T27=e_SC_ARG_MAX:0,_SC_CHILD_MAX:1,_SC_CLK_TCK:2,\_SC_NGROUPS_MAX:3,_SC_OPEN_MAX:4,_SC_STREAM_MAX:5,\_SC_TZNAME_MAX:6,_SC_JOB_CONTROL:7,_SC_SAVED_IDS:8,\_SC_VERSION:9,_SC_CLOCKS_PER_SEC:10,_SC_BC_BASE_MAX:11,\_SC_BC_DIM_MAX:12,_SC_BC_SCALE_MAX:13,_SC_BC_STRING_MAX:14,\_SC_COLL_WEIGHTS_MAX:15,_SC_EQUIV_CLASS_MAX:16,_SC_EXPR_NEST_MAX:17,\_SC_LINE_MAX:18,_SC_RE_DUP_MAX:19,_SC_2_VERSION:20,\_SC_2_C_BIND:21,_SC_2_C_DEV:22,_SC_2_FORT_DEV:23,\_SC_2_FORT_RUN:24,_SC_2_SW_DEV:25,_SC_2_LOCALEDEF:26,;time_t:t3clock_t:t3ptrdiff_t:t1pid_t:t1uid_t:t9gid_t:t9dev_t:t9ino_t:t5mode_t:t9umode_t:t9nlink_t:t9daddr_t:t1off_t:t3u_char:t11u_short:t9u_int:t4u_long:t5unchar:t11ushort:t9uint:t4ulong:t5caddr_t:t24cc_t:t11speed_t:t4tcflag_t:t5fd_set:T28=s32fds_bits:26,0,256;;fd_set:t28ustat:T29=s20f_tfree:1,0,32;f_tinode:5,32,32;\f_fname:30=ar1;0;5;2,64,48;f_fpack:30,112,48;;fd_mask:t5__gnuc_va_list:t31=*19va_list:t31libentry:T32=s16name:24,0,32;avers:24,32,32;\addr:4,64,32;vers:4,96,32;;loadptr:t33=*34=f19header_t:t35=s24magic:30,0,48;version:36=ar1;0;4;2,48,40;\ndirs:2,88,8;nlibs:2,96,8;liboffset:3,128,32;\diroffset:3,160,32;;libentry_t:t37=s12libnamelen:8,0,16;dirnamelen:8,16,16;\liboffset:3,32,32;diroffset:3,64,32;;fixuplist:T38=s16size:1,0,32;magic:39=*1,32,32;\list:40=*41=xsimage_fixuplist:,64,32;shrlib_list:42=ar1;0;0;43=*44=*45=*38,96,32;;elemental_fixup:T46=s8un:47=u4newaddr:1,0,32;\bifu:48=*49=xsbuiltin_fixup:,0,32;;,0,32;fixaddr:39,32,32;;image_fixuplist:T41=s12size:1,0,32;fix:50=ar1;0;0;46,32,64;;builtin_fixup:T49=s8len:1,0,32;fixpnt:51=ar1;0;0;52=*53=xsfile_fixup:,32,32;;builtin_elemental_fixup:T54=s8gotaddr:39,0,32;fixaddr:39,32,32;;file_fixup:T53=s8fixup:55=ar1;0;0;54,0,64;;errno:S1_errno_exitexit:f1code:p1__res:3_uselibuselib:f1filename:p56=*2__res:3_writewrite:f1fd:p1buf:p57=*19count:p4__res:3_munmapmunmap:f1addr:p24len:p4__res:3___load_shared_libraries___SHARED_LIBRARIES____SHARABLE_CONFLICTS___shared_loader__load_shared_libraries:F19argc:p1argv:p58=*24envp:p58msg:59=ar1;0;19;2 ld.so.o/ 760755407 100 100 100644 15029 ` d 8xUVS]u uP؅uP‰e[^]US]؅uP‰]]US]̀E}|E!Eأ]]UWVSUU}}E %EM9Mu<UUEdEu dÉ9]EUUEEe[^_]:, %s: too many directories in library path UhjMQNE}t@} :E UM E hjjEƐ}t"=uMQhpj E ]/%s: can't load library '%s' %s UMQM Qh4M Q|MQM QlM Q`‰‰UuA=t8M QMQh6j- QPhSj E]/usr/lib:/lib1.4.3/lib/ld.so%s: version %s %s: invalid dynamic linker option %d LD_NOWARNLD_KEEPDIR__LDD_ARGV0LD_LIBRARY_PATH/etc/ld.so.cache/etc/ld.so.conf %s (%s) => not found %s: can't find library '%s' %s (%s) => %s %s: using incompatible library '%s' Desire minor version >= %d and found %d %s: incompatible library '%s' Require major version %d and found %d dynamic linker error in%s: %s fixup pass 1 %s: %s resolve pass %s: %s fixup pass 2 %s: %s reset pass U,WVSEDžhXXH\H`fH fdEtKt"t5hhh#jz" DžhE TTT TTPTTL3MQhh3jh~hYȉDhcȉ@Hu(hnHHu DžHhzkttt8?f6f6t<'f96uf9u tntQPЃЍ)ԉ0tQ0QP|PMQHQ/E8Ph<<jjhP llPlQ%BЃЍ)ԉtQtQlQ lQttQ|PMQHQEEXP|PMQHQEPxx8xJ0j/x Q6ttt@u tx tt8/uEtQPjPȉDžDžpuSp9E~HtQp|QPHQp뱐s<ftQf<<Džp|P 9pfpfff9 P<BpӉىDPtQ- <BpӉىDP<BpӉىDPPHQpx<HDžpukP 9p}YtQQPHQXpQP뗐uwht.xJQtQhj:tQHQhjfhht7PxJQtQhjIxJ Q0QtDumPHQhj0d1PxJ d1PhjMPHQh>j&0PxB %Rh]jhpxL<t8Q  B  > h:    _ X   m f !  +     '    P       i dC >& !  {vq      wo !   dj $_ %d<dDfx^|B]yD $B'M(X)c*o+|,-./<=>ABO)^=",7D!M"V#_$h(q*{+,-.1234789:<> ?@ BVM| -8S?zDD D@D@$ @@PDPDWDD$P  @ - _ z 6  ? j  ? x   1 #F  * ) X ` T UD\D\D\$\\\DbDcDg`$ba a  DlDmDo*DqDpDtDu2Dw(Dx0Dx0<$lHkRk [kfko&mz{0|`D{`D|fD~fDvDDDDDDDD${`zz zz|fDDDDD=DpDDDDDDDDDD D=DZDDDD DD DDADyDyDy" D.DD4DD;DAD.D=DcD cD DDDHDDD D D! QDB D%P D&x D% D) D+ D, D- D0 D2: YD5 D0 D= D? DA DC DB DD@ DE@ DI@ DLI DMR DP DQ DS DW DZ D\ D` Dc@ DfI Dhf Dk Dn Dp DrDs0Dw@D @DzPD{YaDoD|DiDDDvDDD D7DTDpDDDDD$|xtplhX TP(LAHJDS@]& M& [ j& x    libtkx.so.3.1.1libtk.so.3.1.1libtclx.so.3.1.1libtcl.so.3.1librl.so.1.2.1libm.so.4.4.4libitcl.so.3.0libx.so.4.4.4libXt.so.3.1.0libXpm.so.3.3.0libXaw.so.3.1.0libX11.so.3.1.0libBLT.so.3.3/usr/local/lib/usr/X386/lib/usr/lib/lib