]> Cypherpunks repositories - gostls13.git/commitdiff
ld: Add -I option to set ELF interpreter.
authorIan Lance Taylor <iant@golang.org>
Tue, 1 Feb 2011 20:49:56 +0000 (12:49 -0800)
committerIan Lance Taylor <iant@golang.org>
Tue, 1 Feb 2011 20:49:56 +0000 (12:49 -0800)
R=rsc
CC=golang-dev
https://golang.org/cl/4080049

12 files changed:
src/cmd/5l/asm.c
src/cmd/5l/doc.go
src/cmd/5l/l.h
src/cmd/5l/obj.c
src/cmd/6l/asm.c
src/cmd/6l/doc.go
src/cmd/6l/l.h
src/cmd/6l/obj.c
src/cmd/8l/asm.c
src/cmd/8l/doc.go
src/cmd/8l/l.h
src/cmd/8l/obj.c

index 9767e830360329518d87578c7e05f9b4e432b791..34565629f68a27d1244058997f5ce1f764da144e 100644 (file)
@@ -448,7 +448,9 @@ asmb(void)
                        sh->type = SHT_PROGBITS;
                        sh->flags = SHF_ALLOC;
                        sh->addralign = 1;
-                       elfinterp(sh, startva, linuxdynld);
+                       if(interpreter == nil)
+                               interpreter = linuxdynld;
+                       elfinterp(sh, startva, interpreter);
 
                        ph = newElfPhdr();
                        ph->type = PT_INTERP;
index 72b5c339257d62dee01fcc2df1b43e14c9331497..d266b923310f2cd1ec9ad7534afbc8d9344bc8ee 100644 (file)
@@ -23,6 +23,8 @@ Options new in this version:
 -F
        Force use of software floating point.
        Also implied by setting GOARM=5 in the environment.
+-I interpreter
+       Set the ELF dynamic linker to use.
 -L dir1 -L dir2
        Search for libraries (package files) in dir1, dir2, etc.
        The default is the single location $GOROOT/pkg/$GOOS_arm.
index ceffac86d608c014cf1408a5fd694f005485edc5..c31028416951cba53f8681baaad67c62ae33401d 100644 (file)
@@ -332,6 +332,7 @@ EXTERN      Oprang  thumboprange[ALAST];
 EXTERN char*   outfile;
 EXTERN int32   pc;
 EXTERN uchar   repop[ALAST];
+EXTERN char*   interpreter;
 EXTERN char*   rpath;
 EXTERN uint32  stroffset;
 EXTERN int32   symsize;
index b3e20fbd8179bdca22d7dd8cc57226983c48ea69..5b778d7772d85967eaf89191c4ccf9deb1b0321b 100644 (file)
@@ -61,7 +61,7 @@ linkername[] =
 void
 usage(void)
 {
-       fprint(2, "usage: 5l [-E entry] [-H head] [-L dir] [-T text] [-D data] [-R rnd] [-r path] [-o out] main.5\n");
+       fprint(2, "usage: 5l [-E entry] [-H head] [-I interpreter] [-L dir] [-T text] [-D data] [-R rnd] [-r path] [-o out] main.5\n");
        errorexit();
 }
 
@@ -100,6 +100,9 @@ main(int argc, char *argv[])
        case 'E':
                INITENTRY = EARGF(usage());
                break;
+       case 'I':
+               interpreter = EARGF(usage());
+               break;
        case 'L':
                Lflag(EARGF(usage()));
                break;
index f82fef543f2af081b6bd5772cbcab572e2a8f04c..d6ffa4ff9df57a460735ed4d95b3ed6aa79c9b5c 100644 (file)
@@ -915,14 +915,17 @@ asmb(void)
                        sh->type = SHT_PROGBITS;
                        sh->flags = SHF_ALLOC;
                        sh->addralign = 1;
-                       switch(HEADTYPE) {
-                       case 7:
-                               elfinterp(sh, startva, linuxdynld);
-                               break;
-                       case 9:
-                               elfinterp(sh, startva, freebsddynld);
-                               break;
+                       if(interpreter == nil) {
+                               switch(HEADTYPE) {
+                               case 7:
+                                       interpreter = linuxdynld;
+                                       break;
+                               case 9:
+                                       interpreter = freebsddynld;
+                                       break;
+                               }
                        }
+                       elfinterp(sh, startva, interpreter);
 
                        ph = newElfPhdr();
                        ph->type = PT_INTERP;
index 501317f36b9662709c3ec04ae1f316a90792a95e..97fa2cc5a2de2263c6031fbcbeb627e75f05f47c 100644 (file)
@@ -32,6 +32,8 @@ Options new in this version:
        Write Apple Mach-O binaries (default when $GOOS is darwin)
 -H7
        Write Linux ELF binaries (default when $GOOS is linux)
+-I interpreter
+       Set the ELF dynamic linker to use.
 -L dir1 -L dir2
        Search for libraries (package files) in dir1, dir2, etc.
        The default is the single location $GOROOT/pkg/$GOOS_amd64.
index 01896d3599168a143df44a7902c98bee85223d5d..7f22493e0c57a047c9eff44e068c906af18b20ed 100644 (file)
@@ -352,6 +352,7 @@ EXTERN      int     nerrors;
 EXTERN char*   noname;
 EXTERN char*   outfile;
 EXTERN vlong   pc;
+EXTERN char*   interpreter;
 EXTERN char*   rpath;
 EXTERN int32   spsize;
 EXTERN Sym*    symlist;
index eae76e5d86b2559d02ccdccaf6450492d4b36c6c..f9e257842794e514c8cdf90dbb068279db6b0f87 100644 (file)
@@ -58,7 +58,7 @@ char* paramspace      = "FP";
 void
 usage(void)
 {
-       fprint(2, "usage: 6l [-options] [-E entry] [-H head] [-L dir] [-T text] [-R rnd] [-r path] [-o out] main.6\n");
+       fprint(2, "usage: 6l [-options] [-E entry] [-H head] [-I interpreter] [-L dir] [-T text] [-R rnd] [-r path] [-o out] main.6\n");
        exits("usage");
 }
 
@@ -96,6 +96,9 @@ main(int argc, char *argv[])
        case 'H':
                HEADTYPE = atolwhex(EARGF(usage()));
                break;
+       case 'I':
+               interpreter = EARGF(usage());
+               break;
        case 'L':
                Lflag(EARGF(usage()));
                break;
index 0c698990c39ce7bb196667b196b1a49af0839050..6e83d8deaa8f01c178e420bab49b4ee1ddacf7d3 100644 (file)
@@ -936,14 +936,17 @@ asmb(void)
                        sh->type = SHT_PROGBITS;
                        sh->flags = SHF_ALLOC;
                        sh->addralign = 1;
-                       switch(HEADTYPE) {
-                       case 7:
-                               elfinterp(sh, startva, linuxdynld);
-                               break;
-                       case 9:
-                               elfinterp(sh, startva, freebsddynld);
-                               break;
+                       if(interpreter == nil) {
+                               switch(HEADTYPE) {
+                               case 7:
+                                       interpreter = linuxdynld;
+                                       break;
+                               case 9:
+                                       interpreter = freebsddynld;
+                                       break;
+                               }
                        }
+                       elfinterp(sh, startva, interpreter);
 
                        ph = newElfPhdr();
                        ph->type = PT_INTERP;
index 0bf6f151fe9af3b626650cd52d3bc6f2d1c82f3c..ef5ebc31db2f72a491d06f5a4cc94afa7569a912 100644 (file)
@@ -29,6 +29,8 @@ Options new in this version:
        Write Apple Mach-O binaries (default when $GOOS is darwin)
 -H7
        Write Linux ELF binaries (default when $GOOS is linux)
+-I interpreter
+       Set the ELF dynamic linker to use.
 -L dir1 -L dir2
        Search for libraries (package files) in dir1, dir2, etc.
        The default is the single location $GOROOT/pkg/$GOOS_386.
index d85453bc3161a18ac00ea3b63386c9d07f3beae5..e0746fc75837e1d7f877ffaafc580380f951a430 100644 (file)
@@ -315,6 +315,7 @@ EXTERN      int     maxop;
 EXTERN int     nerrors;
 EXTERN char*   noname;
 EXTERN int32   pc;
+EXTERN char*   interpreter;
 EXTERN char*   rpath;
 EXTERN int32   spsize;
 EXTERN Sym*    symlist;
index 18b2112fe18db429be46855b224a56de0a465a66..fefb6d8b0de7efb54a1726d32088330c72914ce8 100644 (file)
@@ -64,7 +64,7 @@ char  *thestring      = "386";
 void
 usage(void)
 {
-       fprint(2, "usage: 8l [-options] [-E entry] [-H head] [-L dir] [-T text] [-R rnd] [-r path] [-o out] main.8\n");
+       fprint(2, "usage: 8l [-options] [-E entry] [-H head] [-I interpreter] [-L dir] [-T text] [-R rnd] [-r path] [-o out] main.8\n");
        exits("usage");
 }
 
@@ -102,6 +102,9 @@ main(int argc, char *argv[])
        case 'H':
                HEADTYPE = atolwhex(EARGF(usage()));
                break;
+       case 'I':
+               interpreter = EARGF(usage());
+               break;
        case 'L':
                Lflag(EARGF(usage()));
                break;