diff options
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']) { |