From fa2f9983992b8f76f4876d186e7f838007698a3a Mon Sep 17 00:00:00 2001 From: jkh Date: Sat, 11 Dec 1993 12:02:10 +0000 Subject: Sync up with Paul K's latest ld from cesium. --- libexec/rtld-aout/i386/md.h | 30 +++++++++++++++++++++++++++++- libexec/rtld-aout/shlib.c | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 62 insertions(+), 4 deletions(-) (limited to 'libexec') diff --git a/libexec/rtld-aout/i386/md.h b/libexec/rtld-aout/i386/md.h index 714073b..285b0e6 100644 --- a/libexec/rtld-aout/i386/md.h +++ b/libexec/rtld-aout/i386/md.h @@ -1,5 +1,33 @@ /* - * $Id: md.h,v 1.3 1993/11/22 19:05:24 jkh Exp $ - I386 dependent definitions + * Copyright (c) 1993 Paul Kranenburg + * 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. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Paul Kranenburg. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software withough specific prior written permission + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + * + * $Id: md.h,v 1.5 1993/12/08 10:14:48 pk Exp $ */ diff --git a/libexec/rtld-aout/shlib.c b/libexec/rtld-aout/shlib.c index b6cb74e..dcca01f 100644 --- a/libexec/rtld-aout/shlib.c +++ b/libexec/rtld-aout/shlib.c @@ -1,5 +1,5 @@ /* - * $Id: shlib.c,v 1.4 1993/12/02 00:56:40 jkh Exp $ + * $Id: shlib.c,v 1.5 1993/12/04 00:53:02 jkh Exp $ */ #include @@ -11,16 +11,21 @@ #include #include #include +#include #include #include #include "ld.h" +#ifdef SUNOS4 +char *strsep(); +#endif + /* * Standard directories to search for files specified by -l. */ #ifndef STANDARD_SEARCH_DIRS -#define STANDARD_SEARCH_DIRS "/usr/lib", "/usr/local/lib" +#define STANDARD_SEARCH_DIRS "/usr/lib", "/usr/X386/lib", "/usr/local/lib" #endif char *standard_search_dirs[] = { @@ -132,9 +137,10 @@ int n1, n2; #undef minor char * -findshlib(name, majorp, minorp) +findshlib(name, majorp, minorp, do_dot_a) char *name; int *majorp, *minorp; +int do_dot_a; { int dewey[MAXDEWEY]; int ndewey; @@ -154,6 +160,7 @@ int *majorp, *minorp; for (i = 0; i < n_search_dirs; i++) { DIR *dd = opendir(search_dirs[i]); struct dirent *dp; + int found_dot_a = 0; if (dd == NULL) continue; @@ -161,6 +168,16 @@ int *majorp, *minorp; while ((dp = readdir(dd)) != NULL) { int n, j, might_take_it = 0; + if (do_dot_a && path == NULL && + dp->d_namlen == len + 2 && + strncmp(dp->d_name, lname, len) == 0 && + (dp->d_name+len)[0] == '.' && + (dp->d_name+len)[1] == 'a') { + + path = concat(search_dirs[i], "/", dp->d_name); + found_dot_a = 1; + } + if (dp->d_namlen < len + 4) continue; if (strncmp(dp->d_name, lname, len) != 0) @@ -171,6 +188,12 @@ int *majorp, *minorp; if ((n = getdewey(tmp, dp->d_name+len+4)) == 0) continue; + if (major != -1 && found_dot_a) { /* XXX */ + free(path); + path = NULL; + found_dot_a = 0; + } + if (major == -1 && minor == -1) { might_take_it = 1; } else if (major != -1 && minor == -1) { @@ -192,12 +215,19 @@ int *majorp, *minorp; if (path) free(path); path = concat(search_dirs[i], "/", dp->d_name); + found_dot_a = 0; bcopy(tmp, dewey, sizeof(dewey)); ndewey = n; *majorp = dewey[0]; *minorp = dewey[1]; } closedir(dd); + + if (found_dot_a) + /* + * There's a .a archive here. + */ + return path; } return path; -- cgit v1.1