summaryrefslogtreecommitdiff
path: root/src/cmd/8l/obj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/8l/obj.c')
-rw-r--r--src/cmd/8l/obj.c94
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();