Commit e6443f62 authored by Ian Lance Taylor's avatar Ian Lance Taylor

Add -r option to 6l/8l/5l.

This permits more flexibility with cgo and swig in cases where
the program is run on a machine other than the one on which it
is built.  Rather than storing the absolute path to the shared
library in the DT_NEEDED entry, we can store just the name,
and let the dynamic linker find it using DT_RUNPATH or the
LD_LIBRARY_PATH environment variable.

R=rsc
CC=golang-dev
https://golang.org/cl/223068
parent ba50599e
...@@ -322,6 +322,8 @@ doelf(void) ...@@ -322,6 +322,8 @@ doelf(void)
elfwritedynentsym(s, DT_REL, lookup(".rel", 0)); elfwritedynentsym(s, DT_REL, lookup(".rel", 0));
elfwritedynentsymsize(s, DT_RELSZ, lookup(".rel", 0)); elfwritedynentsymsize(s, DT_RELSZ, lookup(".rel", 0));
elfwritedynent(s, DT_RELENT, ELF32RELSIZE); elfwritedynent(s, DT_RELENT, ELF32RELSIZE);
if(rpath)
elfwritedynent(s, DT_RUNPATH, addstring(dynstr, rpath));
elfwritedynent(s, DT_NULL, 0); elfwritedynent(s, DT_NULL, 0);
} }
} }
......
...@@ -23,6 +23,8 @@ Options new in this version: ...@@ -23,6 +23,8 @@ Options new in this version:
-L dir1,dir2,.. -L dir1,dir2,..
Search for libraries (package files) in the comma-separated list of directories. Search for libraries (package files) in the comma-separated list of directories.
The default is the single location $GOROOT/pkg/$GOOS_arm. The default is the single location $GOROOT/pkg/$GOOS_arm.
-r dir1:dir2:...
Set the dynamic linker search path when using ELF.
-V -V
Print the linker version. Print the linker version.
......
...@@ -333,6 +333,7 @@ EXTERN Oprang thumboprange[ALAST]; ...@@ -333,6 +333,7 @@ EXTERN Oprang thumboprange[ALAST];
EXTERN char* outfile; EXTERN char* outfile;
EXTERN int32 pc; EXTERN int32 pc;
EXTERN uchar repop[ALAST]; EXTERN uchar repop[ALAST];
EXTERN char* rpath;
EXTERN uint32 stroffset; EXTERN uint32 stroffset;
EXTERN int32 symsize; EXTERN int32 symsize;
EXTERN Prog* textp; EXTERN Prog* textp;
......
...@@ -81,7 +81,7 @@ linkername[] = ...@@ -81,7 +81,7 @@ linkername[] =
void void
usage(void) usage(void)
{ {
fprint(2, "usage: 5l [-E entry] [-H head] [-L dir] [-T text] [-D data] [-R rnd] [-o out] main.5\n"); fprint(2, "usage: 5l [-E entry] [-H head] [-L dir] [-T text] [-D data] [-R rnd] [-r path] [-o out] main.5\n");
errorexit(); errorexit();
} }
...@@ -128,6 +128,9 @@ main(int argc, char *argv[]) ...@@ -128,6 +128,9 @@ main(int argc, char *argv[])
case 'R': case 'R':
INITRND = atolwhex(EARGF(usage())); INITRND = atolwhex(EARGF(usage()));
break; break;
case 'r':
rpath = EARGF(usage());
break;
case 'H': case 'H':
HEADTYPE = atolwhex(EARGF(usage())); HEADTYPE = atolwhex(EARGF(usage()));
/* do something about setting INITTEXT */ /* do something about setting INITTEXT */
......
...@@ -408,6 +408,8 @@ doelf(void) ...@@ -408,6 +408,8 @@ doelf(void)
elfwritedynentsym(s, DT_RELA, lookup(".rela", 0)); elfwritedynentsym(s, DT_RELA, lookup(".rela", 0));
elfwritedynentsymsize(s, DT_RELASZ, lookup(".rela", 0)); elfwritedynentsymsize(s, DT_RELASZ, lookup(".rela", 0));
elfwritedynent(s, DT_RELAENT, ELF64RELASIZE); elfwritedynent(s, DT_RELAENT, ELF64RELASIZE);
if(rpath)
elfwritedynent(s, DT_RUNPATH, addstring(dynstr, rpath));
elfwritedynent(s, DT_NULL, 0); elfwritedynent(s, DT_NULL, 0);
} }
} }
......
...@@ -35,6 +35,8 @@ Options new in this version: ...@@ -35,6 +35,8 @@ Options new in this version:
-L dir1,dir2,.. -L dir1,dir2,..
Search for libraries (package files) in the comma-separated list of directories. Search for libraries (package files) in the comma-separated list of directories.
The default is the single location $GOROOT/pkg/$GOOS_amd64. The default is the single location $GOROOT/pkg/$GOOS_amd64.
-r dir1:dir2:...
Set the dynamic linker search path when using ELF.
-V -V
Print the linker version. Print the linker version.
......
...@@ -330,6 +330,7 @@ EXTERN int nerrors; ...@@ -330,6 +330,7 @@ EXTERN int nerrors;
EXTERN char* noname; EXTERN char* noname;
EXTERN char* outfile; EXTERN char* outfile;
EXTERN vlong pc; EXTERN vlong pc;
EXTERN char* rpath;
EXTERN int32 spsize; EXTERN int32 spsize;
EXTERN Sym* symlist; EXTERN Sym* symlist;
EXTERN int32 symsize; EXTERN int32 symsize;
......
...@@ -76,7 +76,7 @@ isobjfile(char *f) ...@@ -76,7 +76,7 @@ isobjfile(char *f)
void void
usage(void) usage(void)
{ {
fprint(2, "usage: 6l [-options] [-E entry] [-H head] [-L dir] [-T text] [-R rnd] [-o out] main.6\n"); fprint(2, "usage: 6l [-options] [-E entry] [-H head] [-L dir] [-T text] [-R rnd] [-r path] [-o out] main.6\n");
exits("usage"); exits("usage");
} }
...@@ -126,6 +126,9 @@ main(int argc, char *argv[]) ...@@ -126,6 +126,9 @@ main(int argc, char *argv[])
case 'R': case 'R':
INITRND = atolwhex(EARGF(usage())); INITRND = atolwhex(EARGF(usage()));
break; break;
case 'r':
rpath = EARGF(usage());
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]))
......
...@@ -398,6 +398,8 @@ doelf(void) ...@@ -398,6 +398,8 @@ doelf(void)
elfwritedynentsym(s, DT_REL, lookup(".rel", 0)); elfwritedynentsym(s, DT_REL, lookup(".rel", 0));
elfwritedynentsymsize(s, DT_RELSZ, lookup(".rel", 0)); elfwritedynentsymsize(s, DT_RELSZ, lookup(".rel", 0));
elfwritedynent(s, DT_RELENT, ELF32RELSIZE); elfwritedynent(s, DT_RELENT, ELF32RELSIZE);
if(rpath)
elfwritedynent(s, DT_RUNPATH, addstring(dynstr, rpath));
elfwritedynent(s, DT_NULL, 0); elfwritedynent(s, DT_NULL, 0);
} }
} }
......
...@@ -32,6 +32,8 @@ Options new in this version: ...@@ -32,6 +32,8 @@ Options new in this version:
-L dir1,dir2,.. -L dir1,dir2,..
Search for libraries (package files) in the comma-separated list of directories. Search for libraries (package files) in the comma-separated list of directories.
The default is the single location $GOROOT/pkg/$GOOS_386. The default is the single location $GOROOT/pkg/$GOOS_386.
-r dir1:dir2:...
Set the dynamic linker search path when using ELF.
-V -V
Print the linker version. Print the linker version.
......
...@@ -295,6 +295,7 @@ EXTERN int maxop; ...@@ -295,6 +295,7 @@ EXTERN int maxop;
EXTERN int nerrors; EXTERN int nerrors;
EXTERN char* noname; EXTERN char* noname;
EXTERN int32 pc; EXTERN int32 pc;
EXTERN char* rpath;
EXTERN int32 spsize; EXTERN int32 spsize;
EXTERN Sym* symlist; EXTERN Sym* symlist;
EXTERN int32 symsize; EXTERN int32 symsize;
......
...@@ -81,7 +81,7 @@ isobjfile(char *f) ...@@ -81,7 +81,7 @@ isobjfile(char *f)
void void
usage(void) usage(void)
{ {
fprint(2, "usage: 8l [-options] [-E entry] [-H head] [-L dir] [-T text] [-R rnd] [-o out] main.8\n"); fprint(2, "usage: 8l [-options] [-E entry] [-H head] [-L dir] [-T text] [-R rnd] [-r path] [-o out] main.8\n");
exits("usage"); exits("usage");
} }
...@@ -131,6 +131,8 @@ main(int argc, char *argv[]) ...@@ -131,6 +131,8 @@ main(int argc, char *argv[])
case 'R': case 'R':
INITRND = atolwhex(EARGF(usage())); INITRND = atolwhex(EARGF(usage()));
break; break;
case 'r':
rpath = EARGF(usage());
break; break;
case 'x': /* produce export table */ case 'x': /* produce export table */
doexp = 1; doexp = 1;
......
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