]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: enable DWARF combining on macOS ARM64
authorCherry Zhang <cherryyz@google.com>
Fri, 4 Sep 2020 18:35:57 +0000 (14:35 -0400)
committerCherry Zhang <cherryyz@google.com>
Tue, 8 Sep 2020 18:52:38 +0000 (18:52 +0000)
It appears the machoCalcStart function is meant to align the
segment, but it doesn't. Replace it with an actual alignment
calculation. Also, use the alignment from the configuration,
instead of hardcode.

With this fix we could enable DWARF combining on macOS ARM64.

Change-Id: I19ec771b77d752b83a54c53b6ee65af78a31b8ae
Reviewed-on: https://go-review.googlesource.com/c/go/+/253558
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/link/internal/arm64/obj.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/ld/macho_combine_dwarf.go

index 37b72b6c377ce0821a45cc72838a33a7baf89fd0..a980cfee52b56c72d2176953bc44a8d59e2a7701 100644 (file)
@@ -105,7 +105,7 @@ func archinit(ctxt *ld.Link) {
                        *ld.FlagTextAddr = 4096 + int64(ld.HEADR)
                }
                if *ld.FlagRound == -1 {
-                       *ld.FlagRound = 4096
+                       *ld.FlagRound = 16384 // 16K page alignment
                }
        }
 }
index 54ac109b20a2dc84adcb2c2103651a33f8fb4177..4295b2a660b6a13b41aa2671dec4ef9d0c6eff69 100644 (file)
@@ -1240,11 +1240,11 @@ func (ctxt *Link) hostlink() {
 
        // On darwin, whether to combine DWARF into executable.
        // Only macOS supports unmapped segments such as our __DWARF segment.
-       combineDwarf := ctxt.IsDarwin() && !*FlagS && !*FlagW && !debug_s && machoPlatform == PLATFORM_MACOS && ctxt.IsAMD64()
+       combineDwarf := ctxt.IsDarwin() && !*FlagS && !*FlagW && !debug_s && machoPlatform == PLATFORM_MACOS
 
        switch ctxt.HeadType {
        case objabi.Hdarwin:
-               if machoPlatform == PLATFORM_MACOS && ctxt.IsAMD64() {
+               if combineDwarf {
                        // Leave room for DWARF combining.
                        // -headerpad is incompatible with -fembed-bitcode.
                        argv = append(argv, "-Wl,-headerpad,1144")
index e43aeb1eb799bc07c5f32f2f08ded3d13fbc3534..77ee8a4d62bde49786dad003f99b4053f31e27c4 100644 (file)
@@ -16,10 +16,6 @@ import (
        "unsafe"
 )
 
-const (
-       pageAlign = 12 // 4096 = 1 << 12
-)
-
 type loadCmd struct {
        Cmd macho.LoadCmd
        Len uint32
@@ -138,7 +134,7 @@ func machoCombineDwarf(ctxt *Link, exef *os.File, exem *macho.File, dsym, outexe
        // Now copy the dwarf data into the output.
        // Kernel requires all loaded segments to be page-aligned in the file,
        // even though we mark this one as being 0 bytes of virtual address space.
-       dwarfstart := machoCalcStart(realdwarf.Offset, linkseg.Offset, pageAlign)
+       dwarfstart := Rnd(int64(linkseg.Offset), int64(*FlagRound))
        if _, err := outf.Seek(dwarfstart, 0); err != nil {
                return err
        }
@@ -166,7 +162,7 @@ func machoCombineDwarf(ctxt *Link, exef *os.File, exem *macho.File, dsym, outexe
        if _, err := exef.Seek(int64(linkseg.Offset), 0); err != nil {
                return err
        }
-       linkstart := machoCalcStart(linkseg.Offset, uint64(dwarfstart)+dwarfsize, pageAlign)
+       linkstart := Rnd(dwarfstart+int64(dwarfsize), int64(*FlagRound))
        if _, err := outf.Seek(linkstart, 0); err != nil {
                return err
        }
@@ -432,12 +428,3 @@ func machoUpdateLoadCommand(r loadCmdReader, linkseg *macho.Segment, linkoffset
        }
        return nil
 }
-
-func machoCalcStart(origAddr, newAddr uint64, alignExp uint32) int64 {
-       align := uint64(1 << alignExp)
-       origMod, newMod := origAddr%align, newAddr%align
-       if origMod == newMod {
-               return int64(newAddr)
-       }
-       return int64(newAddr + align + origMod - newMod)
-}