mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link/internal/ld: consolidate macho platform setup
Determine the macho platform once and use that the two places that need it. This makes it easier to add a third platform check for a follow-up change. Updates #31447 Change-Id: I522a5fface647ab8e608f816c5832d531534df7a Reviewed-on: https://go-review.googlesource.com/c/go/+/174198 Run-TryBot: Elias Naur <mail@eliasnaur.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
a28a942768
commit
a74e01204e
2 changed files with 33 additions and 31 deletions
|
|
@ -1482,12 +1482,8 @@ func (ctxt *Link) hostlink() {
|
|||
if err != nil {
|
||||
Exitf("%s: parsing Mach-O header failed: %v", os.Args[0], err)
|
||||
}
|
||||
load, err := peekMachoPlatform(exem)
|
||||
if err != nil {
|
||||
Exitf("%s: failed to parse Mach-O load commands: %v", os.Args[0], err)
|
||||
}
|
||||
// Only macOS supports unmapped segments such as our __DWARF segment.
|
||||
if load == nil || load.platform == PLATFORM_MACOS {
|
||||
if machoPlatform == PLATFORM_MACOS {
|
||||
if err := machoCombineDwarf(ctxt, exef, exem, dsym, combinedOutput); err != nil {
|
||||
Exitf("%s: combining dwarf failed: %v", os.Args[0], err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -197,6 +197,8 @@ var machohdr MachoHdr
|
|||
|
||||
var load []MachoLoad
|
||||
|
||||
var machoPlatform MachoPlatform
|
||||
|
||||
var seg [16]MachoSeg
|
||||
|
||||
var nseg int
|
||||
|
|
@ -388,6 +390,36 @@ func (ctxt *Link) domacho() {
|
|||
return
|
||||
}
|
||||
|
||||
// Copy platform load command.
|
||||
for _, h := range hostobj {
|
||||
load, err := hostobjMachoPlatform(&h)
|
||||
if err != nil {
|
||||
Exitf("%v", err)
|
||||
}
|
||||
if load != nil {
|
||||
machoPlatform = load.platform
|
||||
ml := newMachoLoad(ctxt.Arch, load.cmd.type_, uint32(len(load.cmd.data)))
|
||||
copy(ml.data, load.cmd.data)
|
||||
break
|
||||
}
|
||||
}
|
||||
if machoPlatform == 0 {
|
||||
machoPlatform = PLATFORM_MACOS
|
||||
if ctxt.LinkMode == LinkInternal {
|
||||
// For lldb, must say LC_VERSION_MIN_MACOSX or else
|
||||
// it won't know that this Mach-O binary is from OS X
|
||||
// (could be iOS or WatchOS instead).
|
||||
// Go on iOS uses linkmode=external, and linkmode=external
|
||||
// adds this itself. So we only need this code for linkmode=internal
|
||||
// and we can assume OS X.
|
||||
//
|
||||
// See golang.org/issues/12941.
|
||||
ml := newMachoLoad(ctxt.Arch, LC_VERSION_MIN_MACOSX, 2)
|
||||
ml.data[0] = 10<<16 | 7<<8 | 0<<0 // OS X version 10.7.0
|
||||
ml.data[1] = 10<<16 | 7<<8 | 0<<0 // SDK 10.7.0
|
||||
}
|
||||
}
|
||||
|
||||
// empirically, string table must begin with " \x00".
|
||||
s := ctxt.Syms.Lookup(".machosymstr", 0)
|
||||
|
||||
|
|
@ -690,32 +722,6 @@ func Asmbmacho(ctxt *Link) {
|
|||
}
|
||||
}
|
||||
}
|
||||
foundLoad := false
|
||||
for _, h := range hostobj {
|
||||
load, err := hostobjMachoPlatform(&h)
|
||||
if err != nil {
|
||||
Exitf("%v", err)
|
||||
}
|
||||
if load != nil {
|
||||
ml := newMachoLoad(ctxt.Arch, load.cmd.type_, uint32(len(load.cmd.data)))
|
||||
copy(ml.data, load.cmd.data)
|
||||
foundLoad = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !foundLoad && ctxt.LinkMode == LinkInternal {
|
||||
// For lldb, must say LC_VERSION_MIN_MACOSX or else
|
||||
// it won't know that this Mach-O binary is from OS X
|
||||
// (could be iOS or WatchOS instead).
|
||||
// Go on iOS uses linkmode=external, and linkmode=external
|
||||
// adds this itself. So we only need this code for linkmode=internal
|
||||
// and we can assume OS X.
|
||||
//
|
||||
// See golang.org/issues/12941.
|
||||
ml := newMachoLoad(ctxt.Arch, LC_VERSION_MIN_MACOSX, 2)
|
||||
ml.data[0] = 10<<16 | 7<<8 | 0<<0 // OS X version 10.7.0
|
||||
ml.data[1] = 10<<16 | 7<<8 | 0<<0 // SDK 10.7.0
|
||||
}
|
||||
|
||||
a := machowrite(ctxt.Arch, ctxt.Out, ctxt.LinkMode)
|
||||
if int32(a) > HEADR {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue