From 95a7d065ca18f0c3ebefdc9d92a123aea799f2a1 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Sat, 22 Mar 2025 13:36:09 +0100 Subject: [PATCH] darwin: support Boehm GC (and use by default) This mostly required some updates to macos-minimal-sdk to add the needed header files and symbols. --- builder/ar.go | 15 +++++++++++++++ builder/bdwgc.go | 3 +-- builder/build.go | 4 ++-- compileopts/target.go | 2 +- lib/macos-minimal-sdk | 2 +- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/builder/ar.go b/builder/ar.go index 245f08ffb..e657776ac 100644 --- a/builder/ar.go +++ b/builder/ar.go @@ -3,6 +3,7 @@ package builder import ( "bytes" "debug/elf" + "debug/macho" "debug/pe" "encoding/binary" "errors" @@ -62,6 +63,20 @@ func makeArchive(arfile *os.File, objs []string) error { fileIndex int }{symbol.Name, i}) } + } else if dbg, err := macho.NewFile(objfile); err == nil { + for _, symbol := range dbg.Symtab.Syms { + // See mach-o/nlist.h + if symbol.Type&0x0e != 0xe { // (symbol.Type & N_TYPE) != N_SECT + continue // undefined symbol + } + if symbol.Type&0x01 == 0 { // (symbol.Type & N_EXT) == 0 + continue // internal symbol (static, etc) + } + symbolTable = append(symbolTable, struct { + name string + fileIndex int + }{symbol.Name, i}) + } } else if dbg, err := pe.NewFile(objfile); err == nil { for _, symbol := range dbg.Symbols { if symbol.StorageClass != 2 { diff --git a/builder/bdwgc.go b/builder/bdwgc.go index d283330f5..88e7a2673 100644 --- a/builder/bdwgc.go +++ b/builder/bdwgc.go @@ -25,6 +25,7 @@ var BoehmGC = Library{ "-DALL_INTERIOR_POINTERS", // scan interior pointers (needed for Go) "-DIGNORE_DYNAMIC_LOADING", // we don't support dynamic loading at the moment "-DNO_GETCONTEXT", // musl doesn't support getcontext() + "-DGC_DISABLE_INCREMENTAL", // don't mess with SIGSEGV and such // Use a minimal environment. "-DNO_MSGBOX_ON_ERROR", // don't call MessageBoxA on Windows @@ -68,8 +69,6 @@ var BoehmGC = Library{ "new_hblk.c", "obj_map.c", "os_dep.c", - "pthread_stop_world.c", - "pthread_support.c", "reclaim.c", } if strings.Split(target, "-")[2] == "windows" { diff --git a/builder/build.go b/builder/build.go index e2756a267..46f4dcbdf 100644 --- a/builder/build.go +++ b/builder/build.go @@ -150,8 +150,8 @@ func Build(pkgName, outpath, tmpdir string, config *compileopts.Config) (BuildRe var libcJob *compileJob switch config.Target.Libc { case "darwin-libSystem": - job := makeDarwinLibSystemJob(config, tmpdir) - libcDependencies = append(libcDependencies, job) + libcJob = makeDarwinLibSystemJob(config, tmpdir) + libcDependencies = append(libcDependencies, libcJob) case "musl": var unlock func() libcJob, unlock, err = libMusl.load(config, tmpdir, nil) diff --git a/compileopts/target.go b/compileopts/target.go index 7a38d0f1f..baf6c1214 100644 --- a/compileopts/target.go +++ b/compileopts/target.go @@ -380,7 +380,7 @@ func defaultTarget(options *Options) (*TargetSpec, error) { llvmvendor := "unknown" switch options.GOOS { case "darwin": - spec.GC = "precise" + spec.GC = "boehm" platformVersion := "10.12.0" if options.GOARCH == "arm64" { platformVersion = "11.0.0" // first macosx platform with arm64 support diff --git a/lib/macos-minimal-sdk b/lib/macos-minimal-sdk index 9b69407cb..e7c72156e 160000 --- a/lib/macos-minimal-sdk +++ b/lib/macos-minimal-sdk @@ -1 +1 @@ -Subproject commit 9b69407cb59f8ccbb674bb77b358df7befcbb42b +Subproject commit e7c72156eac3ebf29c34cc2faa71efcb1296663f