summaryrefslogtreecommitdiffstats
path: root/libexec/rtld-aout/shlib.c
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1993-12-11 12:02:10 +0000
committerjkh <jkh@FreeBSD.org>1993-12-11 12:02:10 +0000
commitfa2f9983992b8f76f4876d186e7f838007698a3a (patch)
tree9dc50398c34bcf4df5b21ad170bcfc2ec5d49cff /libexec/rtld-aout/shlib.c
parentfae8cc8948a605d587d12154817c04384efa8e15 (diff)
downloadFreeBSD-src-fa2f9983992b8f76f4876d186e7f838007698a3a.zip
FreeBSD-src-fa2f9983992b8f76f4876d186e7f838007698a3a.tar.gz
Sync up with Paul K's latest ld from cesium.
Diffstat (limited to 'libexec/rtld-aout/shlib.c')
-rw-r--r--libexec/rtld-aout/shlib.c36
1 files changed, 33 insertions, 3 deletions
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 <sys/param.h>
@@ -11,16 +11,21 @@
#include <sys/time.h>
#include <fcntl.h>
#include <string.h>
+#include <ctype.h>
#include <dirent.h>
#include <a.out.h>
#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;
OpenPOWER on IntegriCloud