projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Sync up with Paul K's latest ld from cesium.
[unix-history]
/
gnu
/
usr.bin
/
ld
/
shlib.c
diff --git
a/gnu/usr.bin/ld/shlib.c
b/gnu/usr.bin/ld/shlib.c
index
b6cb74e
..
dcca01f
100644
(file)
--- a/
gnu/usr.bin/ld/shlib.c
+++ b/
gnu/usr.bin/ld/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>
*/
#include <sys/param.h>
@@
-11,16
+11,21
@@
#include <sys/time.h>
#include <fcntl.h>
#include <string.h>
#include <sys/time.h>
#include <fcntl.h>
#include <string.h>
+#include <ctype.h>
#include <dirent.h>
#include <a.out.h>
#include "ld.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
/*
* 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[] = {
#endif
char *standard_search_dirs[] = {
@@
-132,9
+137,10
@@
int n1, n2;
#undef minor
char *
#undef minor
char *
-findshlib(name, majorp, minorp)
+findshlib(name, majorp, minorp
, do_dot_a
)
char *name;
int *majorp, *minorp;
char *name;
int *majorp, *minorp;
+int do_dot_a;
{
int dewey[MAXDEWEY];
int ndewey;
{
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;
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;
if (dd == NULL)
continue;
@@
-161,6
+168,16
@@
int *majorp, *minorp;
while ((dp = readdir(dd)) != NULL) {
int n, j, might_take_it = 0;
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)
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 ((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) {
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);
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);
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;
}
return path;