diff options
| author | Hector Chu <hectorchu@gmail.com> | 2009-12-13 12:39:20 -0800 |
|---|---|---|
| committer | Hector Chu <hectorchu@gmail.com> | 2009-12-13 12:39:20 -0800 |
| commit | 41571e5c6b33f5a48ad748ddcbe0b65b93bccd10 (patch) | |
| tree | cda9259e623b814b5a7abe41839cea648a6763aa /src/cmd/8l/obj.c | |
| parent | 4a1dc14dabaee0d29e13736cf255dfb5a1736f80 (diff) | |
| download | golang-41571e5c6b33f5a48ad748ddcbe0b65b93bccd10.tar.gz | |
8l: add support for PE output.
R=rsc
http://codereview.appspot.com/166080
Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/cmd/8l/obj.c')
| -rw-r--r-- | src/cmd/8l/obj.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/cmd/8l/obj.c b/src/cmd/8l/obj.c index dc66e6ee3..89ddf0313 100644 --- a/src/cmd/8l/obj.c +++ b/src/cmd/8l/obj.c @@ -33,6 +33,7 @@ #include "../ld/lib.h" #include "../ld/elf.h" #include "../ld/macho.h" +#include "../ld/pe.h" #include <ar.h> #ifndef DEFAULT @@ -94,7 +95,7 @@ main(int argc, char *argv[]) listinit(); memset(debug, 0, sizeof(debug)); nerrors = 0; - outfile = "8.out"; + outfile = nil; HEADTYPE = -1; INITTEXT = -1; INITDAT = -1; @@ -145,7 +146,7 @@ main(int argc, char *argv[]) if(*argv == 0) usage(); - libinit(); + mywhatsys(); // get goos if(HEADTYPE == -1) { HEADTYPE = 2; @@ -161,9 +162,21 @@ main(int argc, char *argv[]) if(strcmp(goos, "freebsd") == 0) HEADTYPE = 9; else - print("goos is not known: %sn", goos); + if(strcmp(goos, "mingw") == 0) + HEADTYPE = 10; + else + print("goos is not known: %s\n", goos); + } + + if(outfile == nil) { + if(HEADTYPE == 10) + outfile = "8.out.exe"; + else + outfile = "8.out"; } + libinit(); + switch(HEADTYPE) { default: diag("unknown -H option"); @@ -260,6 +273,16 @@ main(int argc, char *argv[]) if(INITRND == -1) INITRND = 4096; break; + case 10: /* PE executable */ + peinit(); + HEADR = PERESERVE; + if(INITTEXT == -1) + INITTEXT = PEBASE+0x1000; + if(INITDAT == -1) + INITDAT = 0; + if(INITRND == -1) + INITRND = PEALIGN; + break; } if(INITDAT != 0 && INITRND != 0) print("warning: -D0x%lux is ignored because of -R0x%lux\n", @@ -387,6 +410,8 @@ main(int argc, char *argv[]) doprof2(); span(); doinit(); + if(HEADTYPE == 10) + dope(); asmb(); undef(); if(debug['v']) { |
