diff options
Diffstat (limited to 'src/cmd/8l/obj.c')
-rw-r--r-- | src/cmd/8l/obj.c | 94 |
1 files changed, 44 insertions, 50 deletions
diff --git a/src/cmd/8l/obj.c b/src/cmd/8l/obj.c index 9c687f2fc..d505dc10e 100644 --- a/src/cmd/8l/obj.c +++ b/src/cmd/8l/obj.c @@ -44,21 +44,36 @@ #endif char *noname = "<none>"; -char thechar = '8'; char *thestring = "386"; +Header headers[] = { + "garbunix", Hgarbunix, + "unixcoff", Hunixcoff, + "plan9", Hplan9x32, + "msdoscom", Hmsdoscom, + "msdosexe", Hmsdosexe, + "darwin", Hdarwin, + "linux", Hlinux, + "nacl", Hnacl, + "freebsd", Hfreebsd, + "windows", Hwindows, + "windowsgui", Hwindows, + "tiny", Htiny, + 0, 0 +}; + /* - * -H0 -T0x40004C -D0x10000000 is garbage unix - * -H1 -T0xd0 -R4 is unix coff - * -H2 -T4128 -R4096 is plan9 format - * -H3 -Tx -Rx is MS-DOS .COM - * -H4 -Tx -Rx is fake MS-DOS .EXE - * -H6 -Tx -Rx is Apple Mach-O - * -H7 -Tx -Rx is Linux ELF32 - * -H8 -Tx -Rx was Google Native Client - * -H9 -Tx -Rx is FreeBSD ELF32 - * -H10 -Tx -Rx is MS Windows PE - * -H11 -Tx -Rx is tiny (os image) + * -Hgarbunix -T0x40004C -D0x10000000 is garbage unix + * -Hunixcoff -T0xd0 -R4 is unix coff + * -Hplan9 -T4128 -R4096 is plan9 format + * -Hmsdoscom -Tx -Rx is MS-DOS .COM + * -Hmsdosexe -Tx -Rx is fake MS-DOS .EXE + * -Hdarwin -Tx -Rx is Apple Mach-O + * -Hlinux -Tx -Rx is Linux ELF32 + * -Hnacl -Tx -Rx was Google Native Client + * -Hfreebsd -Tx -Rx is FreeBSD ELF32 + * -Hwindows -Tx -Rx is MS Windows PE32 + * -Htiny -Tx -Rx is tiny (os image) */ void @@ -100,7 +115,7 @@ main(int argc, char *argv[]) INITENTRY = EARGF(usage()); break; case 'H': - HEADTYPE = atolwhex(EARGF(usage())); + HEADTYPE = headtype(EARGF(usage())); break; case 'I': interpreter = EARGF(usage()); @@ -130,46 +145,24 @@ main(int argc, char *argv[]) mywhatsys(); // get goos - if(HEADTYPE == -1) { - HEADTYPE = 2; - if(strcmp(goos, "linux") == 0) - HEADTYPE = 7; - else - if(strcmp(goos, "darwin") == 0) - HEADTYPE = 6; - else - if(strcmp(goos, "freebsd") == 0) - HEADTYPE = 9; - else - if(strcmp(goos, "windows") == 0) - HEADTYPE = 10; - else - if(strcmp(goos, "tiny") == 0) - HEADTYPE = 11; - else - if(strcmp(goos, "plan9") == 0) - HEADTYPE = 2; - else - print("goos is not known: %s\n", goos); - } + if(HEADTYPE == -1) + HEADTYPE = headtype(goos); if(outfile == nil) { - if(HEADTYPE == 10) + if(HEADTYPE == Hwindows) outfile = "8.out.exe"; else outfile = "8.out"; } libinit(); - if(rpath == nil) - rpath = smprint("%s/pkg/%s_%s", goroot, goos, goarch); switch(HEADTYPE) { default: diag("unknown -H option"); errorexit(); - case 0: /* this is garbage */ + case Hgarbunix: /* this is garbage */ HEADR = 20L+56L; if(INITTEXT == -1) INITTEXT = 0x40004CL; @@ -178,7 +171,7 @@ main(int argc, char *argv[]) if(INITRND == -1) INITRND = 0; break; - case 1: /* is unix coff */ + case Hunixcoff: /* is unix coff */ HEADR = 0xd0L; if(INITTEXT == -1) INITTEXT = 0xd0; @@ -187,7 +180,7 @@ main(int argc, char *argv[]) if(INITRND == -1) INITRND = 0; break; - case 2: /* plan 9 */ + case Hplan9x32: /* plan 9 */ tlsoffset = -8; HEADR = 32L; if(INITTEXT == -1) @@ -197,7 +190,7 @@ main(int argc, char *argv[]) if(INITRND == -1) INITRND = 1; break; - case 3: /* MS-DOS .COM */ + case Hmsdoscom: /* MS-DOS .COM */ HEADR = 0; if(INITTEXT == -1) INITTEXT = 0x0100; @@ -206,7 +199,7 @@ main(int argc, char *argv[]) if(INITRND == -1) INITRND = 4; break; - case 4: /* fake MS-DOS .EXE */ + case Hmsdosexe: /* fake MS-DOS .EXE */ HEADR = 0x200; if(INITTEXT == -1) INITTEXT = 0x0100; @@ -218,7 +211,7 @@ main(int argc, char *argv[]) if(debug['v']) Bprint(&bso, "HEADR = 0x%d\n", HEADR); break; - case 6: /* apple MACH */ + case Hdarwin: /* apple MACH */ /* * OS X system constant - offset from %gs to our TLS. * Explained in ../../libcgo/darwin_386.c. @@ -233,8 +226,8 @@ main(int argc, char *argv[]) if(INITRND == -1) INITRND = 4096; break; - case 7: /* elf32 executable */ - case 9: + case Hlinux: /* elf32 executable */ + case Hfreebsd: /* * ELF uses TLS offsets negative from %gs. * Translate 0(GS) and 4(GS) into -8(GS) and -4(GS). @@ -251,7 +244,7 @@ main(int argc, char *argv[]) if(INITRND == -1) INITRND = 4096; break; - case 10: /* PE executable */ + case Hwindows: /* PE executable */ peinit(); HEADR = PEFILEHEADR; if(INITTEXT == -1) @@ -261,7 +254,7 @@ main(int argc, char *argv[]) if(INITRND == -1) INITRND = PESECTALIGN; break; - case 11: + case Htiny: tlsoffset = 0; elfinit(); HEADR = ELFRESERVE; @@ -306,9 +299,9 @@ main(int argc, char *argv[]) patch(); follow(); doelf(); - if(HEADTYPE == 6) + if(HEADTYPE == Hdarwin) domacho(); - if(HEADTYPE == 10) + if(HEADTYPE == Hwindows) dope(); dostkoff(); if(debug['p']) @@ -323,6 +316,7 @@ main(int argc, char *argv[]) symtab(); dodata(); address(); + doweak(); reloc(); asmb(); undef(); |