goos goarch

SVN=121348
diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c
index 4d1e9d9..724ec5a 100644
--- a/src/cmd/6l/asm.c
+++ b/src/cmd/6l/asm.c
@@ -98,6 +98,13 @@
 }
 
 void
+llputl(vlong v)
+{
+	lputl(v);
+	lputl(v>>32);
+}
+
+void
 strnput(char *s, int n)
 {
 	int i;
@@ -166,6 +173,10 @@
 	case 5:
 		seek(cout, HEADR+textsize, 0);
 		break;
+	case 7:
+		v = rnd(HEADR+textsize, INITRND);
+		seek(cout, v, 0);
+		break;
 	case 6:
 		v = HEADR+textsize;
 		myseek(cout, v);
@@ -207,6 +218,8 @@
 		default:
 		case 2:
 		case 5:
+		case 7:
+debug['s'] = 1;
 			seek(cout, HEADR+textsize+datsize, 0);
 			break;
 		case 6:
@@ -283,7 +296,7 @@
 		wputl(52);			/* Ehdr size */
 		wputl(32);			/* Phdr size */
 		wputl(3);			/* # of Phdrs */
-		wputl(0);			/* Shdr size */
+		wputl(40);			/* Shdr size */
 		wputl(0);			/* # of Shdrs */
 		wputl(0);			/* Shdr string size */
 
@@ -362,6 +375,56 @@
 			1);			/* flag - zero fill */
 		machstack(va+HEADR);
 		break;
+	case 7:
+		/* elf amd-64 */
+		strnput("\177ELF", 4);		/* e_ident */
+		cput(2);			/* class = 64 bit */
+		cput(1);			/* data = LSB */
+		cput(1);			/* version = CURRENT */
+		strnput("", 9);
+
+/*10*/		wputl(2);			/* type = EXEC */
+		wputl(62);			/* machine = AMD64 */
+		lputl(1L);			/* version = CURRENT */
+/*18*/		llputl(entryvalue());		/* entry vaddr */
+		llputl(64L);			/* offset to first phdr */
+		llputl(0L);			/* offset to first shdr */
+/*30*/		lputl(0L);			/* processor specific flags */
+		wputl(64);			/* Ehdr size */
+		wputl(56);			/* Phdr size */
+		wputl(2);			/* # of Phdrs */
+		wputl(64);			/* Shdr size */
+		wputl(0);			/* # of Shdrs */
+		wputl(0);			/* Shdr string size */
+
+		lputl(1L);			/* text - type = PT_LOAD */
+		lputl(1L+4L);			/* text - flags = PF_X+PF_R */
+		llputl(HEADR);			/* file offset */
+		llputl(INITTEXT);		/* vaddr */
+		llputl(INITTEXT);		/* paddr */
+		llputl(textsize);		/* file size */
+		llputl(textsize);		/* memory size */
+		llputl(INITRND);		/* alignment */
+
+		lputl(1L);			/* data - type = PT_LOAD */
+		lputl(1L+2L+4L);		/* text - flags = PF_X+PF_W+PF_R */
+		v = rnd(HEADR+textsize, INITRND);
+		llputl(v);			/* file offset */
+		llputl(INITDAT);		/* vaddr */
+		llputl(INITDAT);		/* paddr */
+		llputl(datsize);		/* file size */
+		llputl(datsize+bsssize);	/* memory size */
+		llputl(INITRND);		/* alignment */
+
+//		lputl(0L);			/* data - type = PT_NULL */
+//		lputl(4L);			/* ro - flags = PF_R */
+//		llputl(HEADR+textsize+datsize);	/* file offset */
+//		llputl(0L);
+//		llputl(0L);
+//		llputl(symsize);		/* symbol table size */
+//		llputl(lcsize);			/* line number size */
+//		llputl(0x04L);			/* alignment */
+		break;
 	}
 	cflush();
 }
diff --git a/src/cmd/6l/l.h b/src/cmd/6l/l.h
index 137474b..3a49dea 100644
--- a/src/cmd/6l/l.h
+++ b/src/cmd/6l/l.h
@@ -338,7 +338,8 @@
 EXTERN	char*	paramspace;
 
 EXTERN	Adr*	reloca;
-EXTERN	int	doexp, dlm;
+EXTERN	int	doexp;		// export table
+EXTERN	int	dlm;		// dynamically loadable module
 EXTERN	int	imports, nimports;
 EXTERN	int	exports, nexports;
 EXTERN	char*	EXPTAB;
diff --git a/src/cmd/6l/obj.c b/src/cmd/6l/obj.c
index 55dcaac..0e5dafe 100644
--- a/src/cmd/6l/obj.c
+++ b/src/cmd/6l/obj.c
@@ -32,15 +32,11 @@
 #include	"l.h"
 #include	<ar.h>
 
-#ifndef	DEFAULT
-#define	DEFAULT	'9'
-#endif
-
 char	*noname		= "<none>";
 char	symname[]	= SYMDEF;
 char	thechar		= '6';
-char	*thestring 	= "amd64";
-char	*paramspace	= "FP";
+char*	thestring 	= "amd64";
+char*	paramspace	= "FP";
 
 /*
  *	-H2 -T4136 -R4096		is plan9 64-bit format
@@ -90,7 +86,7 @@
 	INITDAT = -1;
 	INITRND = -1;
 	INITENTRY = 0;
-HEADTYPE = 6;	// botch
+
 	ARGBEGIN {
 	default:
 		c = ARGC();
@@ -142,14 +138,22 @@
 		diag("usage: 6l [-options] objects");
 		errorexit();
 	}
-	if(!debug['9'] && !debug['U'] && !debug['B'])
-		debug[DEFAULT] = 1;
+
+	mywhatsys();	// get goroot, goarch, goos
+	if(strcmp(goarch, thestring) != 0)
+		print("goarch is not known: %s\n", goarch);
+
 	if(HEADTYPE == -1) {
-		if(debug['B'])
-			HEADTYPE = 2;
-		if(debug['9'])
-			HEADTYPE = 2;
+		HEADTYPE = 2;
+		if(strcmp(goos, "linux") == 0)
+			HEADTYPE = 7;
+		else
+		if(strcmp(goos, "darwin") == 0)
+			HEADTYPE = 6;
+		else
+			print("goos is not known: %s\n", goos);
 	}
+
 	switch(HEADTYPE) {
 	default:
 		diag("unknown -H option");
@@ -190,6 +194,15 @@
 		if(INITRND == -1)
 			INITRND = 4096;
 		break;
+	case 7:	/* elf64 executable */
+		HEADR = rnd(64L+2*56L, 16);
+		if(INITTEXT == -1)
+			INITTEXT = 0x400000L+HEADR;
+		if(INITDAT == -1)
+			INITDAT = 0;
+		if(INITRND == -1)
+			INITRND = 4096;
+		break;
 	}
 	if(INITDAT != 0 && INITRND != 0)
 		print("warning: -D0x%llux is ignored because of -R0x%lux\n",
@@ -300,7 +313,7 @@
 			if(i >= D_X0+8)
 				regrex[i] = Rxr | Rxx | Rxb;
 		}
-		if(i >= D_CR+8 && i <= D_CR+15) 
+		if(i >= D_CR+8 && i <= D_CR+15)
 			regrex[i] = Rxr;
 	}
 
@@ -333,14 +346,18 @@
 	firstp = prg();
 	lastp = firstp;
 
-	if(INITENTRY == 0) {
-		INITENTRY = "_main";
-		if(debug['p'])
-			INITENTRY = "_mainp";
-		if(!debug['l'])
-			lookup(INITENTRY, 0)->type = SXREF;
-	} else if(!(*INITENTRY >= '0' && *INITENTRY <= '9'))
-		lookup(INITENTRY, 0)->type = SXREF;
+	if(INITENTRY == nil) {
+		INITENTRY = "_rt0";
+		a = mal(strlen(INITENTRY)+strlen(goarch)+strlen(goos)+10);
+		strcpy(a, INITENTRY);
+		strcat(a, "_");
+		strcat(a, goarch);
+		strcat(a, "_");
+		strcat(a, goos);
+		INITENTRY = a;
+	}
+
+	lookup(INITENTRY, 0)->type = SXREF;
 
 	while(*argv)
 		objfile(*argv++);
@@ -349,6 +366,7 @@
 	firstp = firstp->link;
 	if(firstp == P)
 		errorexit();
+
 	if(doexp || dlm){
 		EXPTAB = "_exporttab";
 		zerosig(EXPTAB);
@@ -365,6 +383,7 @@
 		}
 		export();
 	}
+
 	patch();
 	follow();
 	dodata();
@@ -812,8 +831,8 @@
 	r = bsize - bloc;
 	if(r < 7)
 		goto eof;
-	if(memcmp(bloc, "x86-64\n", 7) != 0) {
-		diag("file not x86-64: %s\n", pn);
+	if(memcmp(bloc, thestring, strlen(thestring)) != 0) {
+		diag("file not %s\n", thestring);
 		return;
 	}