summaryrefslogtreecommitdiff
path: root/src/cmd/8l
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/8l')
-rw-r--r--src/cmd/8l/Makefile1
-rw-r--r--src/cmd/8l/asm.c21
-rw-r--r--src/cmd/8l/doc.go2
-rw-r--r--src/cmd/8l/l.h2
-rw-r--r--src/cmd/8l/obj.c5
-rw-r--r--src/cmd/8l/pass.c9
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