aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Crawshaw <crawshaw@golang.org>2015-07-20 12:33:39 -0400
committerDavid Crawshaw <crawshaw@golang.org>2015-10-02 11:45:52 +0000
commit47ccf96a9581c3db8ed5dbcb2a6318e8b9566557 (patch)
treec98a129af0dd16e09a91859097fc93567cbe8a22 /src
parent2c911143fda5f9d1aa46d02cc80bd60f9ba17775 (diff)
downloadgo-47ccf96a9581c3db8ed5dbcb2a6318e8b9566557.tar.xz
runtime: darwin/386 entrypoint for c-archive
Change-Id: Ic22597b5e2824cffe9598cb9b506af3426c285fd Reviewed-on: https://go-review.googlesource.com/12412 Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/dist/test.go2
-rw-r--r--src/cmd/link/internal/ld/macho.go2
-rw-r--r--src/runtime/rt0_darwin_386.s55
3 files changed, 57 insertions, 2 deletions
diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go
index 858ad58dd3..0afe4c6060 100644
--- a/src/cmd/dist/test.go
+++ b/src/cmd/dist/test.go
@@ -573,7 +573,7 @@ func (t *tester) supportedBuildmode(mode string) bool {
return false
}
switch pair {
- case "darwin-amd64", "darwin-arm", "darwin-arm64",
+ case "darwin-386", "darwin-amd64", "darwin-arm", "darwin-arm64",
"linux-amd64", "linux-386":
return true
}
diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go
index c02b83f3fc..af93361000 100644
--- a/src/cmd/link/internal/ld/macho.go
+++ b/src/cmd/link/internal/ld/macho.go
@@ -444,7 +444,7 @@ func Asmbmacho() {
ms = newMachoSeg("", 40)
ms.fileoffset = Segtext.Fileoff
- if Thearch.Thechar == '5' {
+ if Thearch.Thechar == '5' || Buildmode == BuildmodeCArchive {
ms.filesize = Segdata.Fileoff + Segdata.Filelen - Segtext.Fileoff
} else {
ms.filesize = Segdwarf.Fileoff + Segdwarf.Filelen - Segtext.Fileoff
diff --git a/src/runtime/rt0_darwin_386.s b/src/runtime/rt0_darwin_386.s
index 4c8c92dda8..be2e5640ed 100644
--- a/src/runtime/rt0_darwin_386.s
+++ b/src/runtime/rt0_darwin_386.s
@@ -12,5 +12,60 @@ TEXT _rt0_386_darwin(SB),NOSPLIT,$8
CALL main(SB)
INT $3
+// With -buildmode=c-archive, this symbol is called from a global constructor.
+TEXT _rt0_386_darwin_lib(SB),NOSPLIT,$0
+ PUSHL BP
+ MOVL SP, BP
+ PUSHL BX
+ PUSHL SI
+ PUSHL DI
+
+ MOVL 8(BP), AX
+ MOVL AX, _rt0_386_darwin_lib_argc<>(SB)
+ MOVL 12(BP), AX
+ MOVL AX, _rt0_386_darwin_lib_argv<>(SB)
+
+ SUBL $12, SP
+
+ // Create a new thread to do the runtime initialization and return.
+ MOVL _cgo_sys_thread_create(SB), AX
+ TESTL AX, AX
+ JZ nocgo
+ MOVL $_rt0_386_darwin_lib_go(SB), BX
+ MOVL BX, 0(SP)
+ MOVL $0, 4(SP)
+ CALL AX
+ JMP restore
+
+nocgo:
+ MOVL $0x800000, 0(SP) // stacksize = 8192KB
+ MOVL $_rt0_386_darwin_lib_go(SB), AX
+ MOVL AX, 4(SP) // fn
+ MOVL $0, 8(SP) // fnarg
+ MOVL $runtime·newosproc0(SB), AX
+ CALL AX
+
+restore:
+ ADDL $12, SP
+ POPL DI
+ POPL SI
+ POPL BX
+ POPL BP
+ RET
+
+TEXT _rt0_386_darwin_lib_go(SB),NOSPLIT,$12
+ MOVL _rt0_386_darwin_lib_argc<>(SB), AX
+ MOVL AX, 0(SP)
+ MOVL _rt0_386_darwin_lib_argv<>(SB), AX
+ MOVL AX, 4(SP)
+ MOVL $runtime·rt0_go(SB), AX
+ CALL AX
+ RET
+
+DATA _rt0_386_darwin_lib_argc<>(SB)/4, $0
+GLOBL _rt0_386_darwin_lib_argc<>(SB),NOPTR, $4
+DATA _rt0_386_darwin_lib_argv<>(SB)/4, $0
+GLOBL _rt0_386_darwin_lib_argv<>(SB),NOPTR, $4
+
TEXT main(SB),NOSPLIT,$0
JMP runtime·rt0_go(SB)