From 41571e5c6b33f5a48ad748ddcbe0b65b93bccd10 Mon Sep 17 00:00:00 2001 From: Hector Chu Date: Sun, 13 Dec 2009 12:39:20 -0800 Subject: 8l: add support for PE output. R=rsc http://codereview.appspot.com/166080 Committer: Russ Cox --- src/cmd/8l/obj.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'src/cmd/8l/obj.c') 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 #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']) { -- cgit v1.2.3