Commit e6bc5bf5 authored by Rob Pike's avatar Rob Pike

allow multiple -L options

R=rsc
DELTA=31  (15 added, 3 deleted, 13 changed)
OCL=35364
CL=35364
parent e8210824
...@@ -296,7 +296,6 @@ EXTERN vlong INITDAT; ...@@ -296,7 +296,6 @@ EXTERN vlong INITDAT;
EXTERN int32 INITRND; EXTERN int32 INITRND;
EXTERN vlong INITTEXT; EXTERN vlong INITTEXT;
EXTERN char* INITENTRY; /* entry point */ EXTERN char* INITENTRY; /* entry point */
EXTERN char* LIBDIR;
EXTERN Biobuf bso; EXTERN Biobuf bso;
EXTERN int32 bsssize; EXTERN int32 bsssize;
EXTERN int cbc; EXTERN int cbc;
......
...@@ -39,6 +39,8 @@ char symname[] = SYMDEF; ...@@ -39,6 +39,8 @@ char symname[] = SYMDEF;
char thechar = '6'; char thechar = '6';
char* thestring = "amd64"; char* thestring = "amd64";
char* paramspace = "FP"; char* paramspace = "FP";
char* libdir[16]; // contains "." first, goroot last
int nlibdir = 0;
/* /*
* -H2 -T4136 -R4096 is plan9 64-bit format * -H2 -T4136 -R4096 is plan9 64-bit format
...@@ -96,7 +98,7 @@ main(int argc, char *argv[]) ...@@ -96,7 +98,7 @@ main(int argc, char *argv[])
INITDAT = -1; INITDAT = -1;
INITRND = -1; INITRND = -1;
INITENTRY = 0; INITENTRY = 0;
LIBDIR = nil; libdir[nlibdir++] = "."; // look in dot first
ARGBEGIN { ARGBEGIN {
default: default:
...@@ -114,7 +116,11 @@ main(int argc, char *argv[]) ...@@ -114,7 +116,11 @@ main(int argc, char *argv[])
HEADTYPE = atolwhex(EARGF(usage())); HEADTYPE = atolwhex(EARGF(usage()));
break; break;
case 'L': case 'L':
LIBDIR = EARGF(usage()); if(nlibdir >= nelem(libdir)-1) {
print("too many -L's: %d\n", nlibdir);
usage();
}
libdir[nlibdir++] = EARGF(usage());
break; break;
case 'T': case 'T':
INITTEXT = atolwhex(EARGF(usage())); INITTEXT = atolwhex(EARGF(usage()));
...@@ -125,7 +131,6 @@ main(int argc, char *argv[]) ...@@ -125,7 +131,6 @@ main(int argc, char *argv[])
case 'R': case 'R':
INITRND = atolwhex(EARGF(usage())); INITRND = atolwhex(EARGF(usage()));
break; break;
break;
case 'x': /* produce export table */ case 'x': /* produce export table */
doexp = 1; doexp = 1;
if(argv[1] != nil && argv[1][0] != '-' && !isobjfile(argv[1])) if(argv[1] != nil && argv[1][0] != '-' && !isobjfile(argv[1]))
...@@ -146,6 +151,9 @@ main(int argc, char *argv[]) ...@@ -146,6 +151,9 @@ main(int argc, char *argv[])
if(strcmp(goarch, thestring) != 0) if(strcmp(goarch, thestring) != 0)
print("goarch is not known: %s\n", goarch); print("goarch is not known: %s\n", goarch);
// put goroot in the libdir list.
libdir[nlibdir++] = smprint("%s/pkg/%s_%s", goroot, goos, goarch);
if(HEADTYPE == -1) { if(HEADTYPE == -1) {
HEADTYPE = 2; HEADTYPE = 2;
if(strcmp(goos, "linux") == 0) if(strcmp(goos, "linux") == 0)
...@@ -699,11 +707,11 @@ addlib(char *src, char *obj) ...@@ -699,11 +707,11 @@ addlib(char *src, char *obj)
if(search) { if(search) {
// try dot, -L "libdir", and then goroot. // try dot, -L "libdir", and then goroot.
snprint(pname, sizeof pname, "./%s", name); for(i=0; i<nlibdir; i++) {
if(access(pname, AEXIST) < 0 && LIBDIR != nil) snprint(pname, sizeof pname, "%s/%s", libdir[i], name);
snprint(pname, sizeof pname, "%s/%s", LIBDIR, name); if(access(pname, AEXIST) >= 0)
if(access(pname, AEXIST) < 0) break;
snprint(pname, sizeof pname, "%s/pkg/%s_%s/%s", goroot, goos, goarch, name); }
strcpy(name, pname); strcpy(name, pname);
} }
cleanname(name); cleanname(name);
......
...@@ -259,7 +259,6 @@ EXTERN int32 INITDAT; ...@@ -259,7 +259,6 @@ EXTERN int32 INITDAT;
EXTERN int32 INITRND; EXTERN int32 INITRND;
EXTERN int32 INITTEXT; EXTERN int32 INITTEXT;
EXTERN char* INITENTRY; /* entry point */ EXTERN char* INITENTRY; /* entry point */
EXTERN char* LIBDIR;
EXTERN Biobuf bso; EXTERN Biobuf bso;
EXTERN int32 bsssize; EXTERN int32 bsssize;
EXTERN int32 casepc; EXTERN int32 casepc;
......
...@@ -42,6 +42,8 @@ char *noname = "<none>"; ...@@ -42,6 +42,8 @@ char *noname = "<none>";
char symname[] = SYMDEF; char symname[] = SYMDEF;
char thechar = '8'; char thechar = '8';
char *thestring = "386"; char *thestring = "386";
char* libdir[16]; // contains "." first, goroot last
int nlibdir = 0;
/* /*
* -H0 -T0x40004C -D0x10000000 is garbage unix * -H0 -T0x40004C -D0x10000000 is garbage unix
...@@ -113,7 +115,11 @@ main(int argc, char *argv[]) ...@@ -113,7 +115,11 @@ main(int argc, char *argv[])
HEADTYPE = atolwhex(EARGF(usage())); HEADTYPE = atolwhex(EARGF(usage()));
break; break;
case 'L': case 'L':
LIBDIR = EARGF(usage()); if(nlibdir >= nelem(libdir)-1) {
print("too many -L's: %d\n", nlibdir);
usage();
}
libdir[nlibdir++] = EARGF(usage());
break; break;
case 'T': case 'T':
INITTEXT = atolwhex(EARGF(usage())); INITTEXT = atolwhex(EARGF(usage()));
...@@ -693,11 +699,11 @@ addlib(char *src, char *obj) ...@@ -693,11 +699,11 @@ addlib(char *src, char *obj)
if(search) { if(search) {
// try dot, -L "libdir", and then goroot. // try dot, -L "libdir", and then goroot.
snprint(pname, sizeof pname, "./%s", name); for(i=0; i<nlibdir; i++) {
if(access(pname, AEXIST) < 0 && LIBDIR != nil) snprint(pname, sizeof pname, "%s/%s", libdir[i], name);
snprint(pname, sizeof pname, "%s/%s", LIBDIR, name); if(access(pname, AEXIST) >= 0)
if(access(pname, AEXIST) < 0) break;
snprint(pname, sizeof pname, "%s/pkg/%s_%s/%s", goroot, goos, goarch, name); }
strcpy(name, pname); strcpy(name, pname);
} }
cleanname(name); cleanname(name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment