blob: 7e298a2eca2d892e3245e6cb8f02412ee153c11b [file] [edit]
// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build 386 || amd64 || arm || arm64 || loong64 || ppc64 || ppc64le || riscv64 || s390x
package runtime
import (
"internal/abi"
"unsafe"
)
// libInit is common startup code for most architectures when
// using -buildmode=c-archive or -buildmode=c-shared.
//
// May run with m.p==nil, so write barriers are not allowed.
//
//go:nowritebarrierrec
//go:nosplit
func libInit() {
// Synchronous initialization.
libpreinit()
// Asynchronous initialization.
// Prefer creating a thread via cgo if it is available.
if _cgo_sys_thread_create != nil {
// No g because the TLS is not set up until later in rt0_go.
asmcgocall_no_g(_cgo_sys_thread_create, unsafe.Pointer(abi.FuncPCABIInternal(rt0_lib_go)))
} else {
const stackSize = 0x800000 // 8192KB
newosproc0(stackSize, unsafe.Pointer(abi.FuncPCABIInternal(rt0_lib_go)))
}
}