runtime: add isarchive, set by the linker

According to Go execution modes, a Go program compiled with
-buildmode=c-archive has a main function, but it is ignored on run.
This gives the runtime the information it needs not to run the main.

I have this working with pending linker changes on darwin/amd64.

Change-Id: I49bd7d65aa619ec847c464a872afa5deea7d4d30
Reviewed-on: https://go-review.googlesource.com/8701
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index e596cab..7b6183d 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -99,6 +99,11 @@
 	needUnlock = false
 	unlockOSThread()
 
+	if isarchive {
+		// A program compiled with -buildmode=c-archive has a main,
+		// but it is not executed.
+		return
+	}
 	main_main()
 	if raceenabled {
 		racefini()
diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go
index 842ebe5..1f4f0da 100644
--- a/src/runtime/runtime2.go
+++ b/src/runtime/runtime2.go
@@ -621,9 +621,12 @@
 	cpuid_ecx         uint32
 	cpuid_edx         uint32
 	lfenceBeforeRdtsc bool
+)
 
-	// Set by the linker when linking with -shared.
-	islibrary bool
+// Set by the linker so the runtime can determine the buildmode.
+var (
+	islibrary bool // -buildmode=c-shared
+	isarchive bool // -buildmode=c-archive
 )
 
 /*