diff options
author | Ondřej Surý <ondrej@sury.org> | 2011-02-14 13:23:51 +0100 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2011-02-14 13:23:51 +0100 |
commit | 758ff64c69e34965f8af5b2d6ffd65e8d7ab2150 (patch) | |
tree | 6d6b34f8c678862fe9b56c945a7b63f68502c245 /src/cmd/8l | |
parent | 3e45412327a2654a77944249962b3652e6142299 (diff) | |
download | golang-upstream/2011-02-01.1.tar.gz |
Imported Upstream version 2011-02-01.1upstream/2011-02-01.1
Diffstat (limited to 'src/cmd/8l')
-rw-r--r-- | src/cmd/8l/Makefile | 1 | ||||
-rw-r--r-- | src/cmd/8l/asm.c | 21 | ||||
-rw-r--r-- | src/cmd/8l/doc.go | 2 | ||||
-rw-r--r-- | src/cmd/8l/l.h | 2 | ||||
-rw-r--r-- | src/cmd/8l/obj.c | 5 | ||||
-rw-r--r-- | src/cmd/8l/pass.c | 9 |
6 files changed, 28 insertions, 12 deletions
diff --git a/src/cmd/8l/Makefile b/src/cmd/8l/Makefile index 84976ba18..a85e3ffa7 100644 --- a/src/cmd/8l/Makefile +++ b/src/cmd/8l/Makefile @@ -16,6 +16,7 @@ OFILES=\ go.$O\ ldelf.$O\ ldmacho.$O\ + ldpe.$O\ lib.$O\ list.$O\ macho.$O\ diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c index cdb5a33e6..6e83d8dea 100644 --- a/src/cmd/8l/asm.c +++ b/src/cmd/8l/asm.c @@ -520,7 +520,7 @@ adddynsym(Sym *s) adduint8(d, 0); // section adduint16(d, 0); // desc adduint32(d, 0); // value - } else { + } else if(HEADTYPE != 10) { diag("adddynsym: unsupported binary format"); } } @@ -540,7 +540,7 @@ adddynlib(char *lib) elfwritedynent(lookup(".dynamic", 0), DT_NEEDED, addstring(s, lib)); } else if(HEADTYPE == 6) { // Mach-O machoadddynlib(lib); - } else { + } else if(HEADTYPE != 10) { diag("adddynlib: unsupported binary format"); } } @@ -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; diff --git a/src/cmd/8l/doc.go b/src/cmd/8l/doc.go index 0bf6f151f..ef5ebc31d 100644 --- a/src/cmd/8l/doc.go +++ b/src/cmd/8l/doc.go @@ -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. diff --git a/src/cmd/8l/l.h b/src/cmd/8l/l.h index daede8879..e0746fc75 100644 --- a/src/cmd/8l/l.h +++ b/src/cmd/8l/l.h @@ -190,7 +190,6 @@ enum SSUB = 1<<8, /* sub-symbol, linked from parent via ->sub list */ NHASH = 10007, - NHUNK = 100000, MINSIZ = 4, STRINGSZ = 200, MINLC = 1, @@ -316,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; diff --git a/src/cmd/8l/obj.c b/src/cmd/8l/obj.c index 18b2112fe..fefb6d8b0 100644 --- a/src/cmd/8l/obj.c +++ b/src/cmd/8l/obj.c @@ -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; diff --git a/src/cmd/8l/pass.c b/src/cmd/8l/pass.c index 6e387b0b5..878a73dac 100644 --- a/src/cmd/8l/pass.c +++ b/src/cmd/8l/pass.c @@ -38,8 +38,15 @@ static void xfol(Prog*, Prog**); // see ../../pkg/runtime/proc.c:/StackGuard enum { +#ifdef __WINDOWS__ + // use larger stacks to compensate for larger stack guard, + // needed for exception handling. + StackSmall = 256, + StackBig = 8192, +#else StackSmall = 128, StackBig = 4096, +#endif }; Prog* @@ -510,7 +517,7 @@ dostkoff(void) p->to.type = D_DX; /* 160 comes from 3 calls (3*8) 4 safes (4*8) and 104 guard */ p->from.type = D_CONST; - if(autoffset+160 > 4096) + if(autoffset+160+cursym->text->to.offset2 > 4096) p->from.offset = (autoffset+160) & ~7LL; p = appendp(p); // save arg size in AX |