mirror of
https://github.com/go-delve/delve.git
synced 2025-10-28 04:35:19 +08:00
proc: fix PIE support on macOS (#3467)
Go1.22 switched to emitting PIE by default and also changed some details of the PIE implementation. This breaks delve entirely on macOS. Fix how relocations are handled on macOS.
This commit is contained in:
committed by
GitHub
parent
894ba63400
commit
ec07c27fc7
@ -1805,11 +1805,17 @@ func loadBinaryInfoMacho(bi *BinaryInfo, image *Image, path string, entryPoint u
|
|||||||
}
|
}
|
||||||
|
|
||||||
if entryPoint != 0 {
|
if entryPoint != 0 {
|
||||||
// This is a little bit hacky. We use the entryPoint variable, but it
|
machoOff := uint64(0x100000000)
|
||||||
// actually holds the address of the mach-o header. We can use this
|
for _, ld := range exe.Loads {
|
||||||
// to calculate the offset to the non-aslr location of the mach-o header
|
if seg, _ := ld.(*macho.Segment); seg != nil {
|
||||||
// (which is 0x100000000)
|
if seg.Name == "__TEXT" {
|
||||||
image.StaticBase = entryPoint - 0x100000000
|
machoOff = seg.Addr
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logflags.DebuggerLogger().Debugf("entryPoint %#x machoOff %#x", entryPoint, machoOff)
|
||||||
|
image.StaticBase = entryPoint - machoOff
|
||||||
}
|
}
|
||||||
|
|
||||||
image.closer = exe
|
image.closer = exe
|
||||||
|
|||||||
@ -662,7 +662,7 @@ func LLDBAttach(pid int, path string, waitFor *proc.WaitFor, debugInfoDirs []str
|
|||||||
// debugging PIEs.
|
// debugging PIEs.
|
||||||
func (p *gdbProcess) EntryPoint() (uint64, error) {
|
func (p *gdbProcess) EntryPoint() (uint64, error) {
|
||||||
var entryPoint uint64
|
var entryPoint uint64
|
||||||
if p.bi.GOOS == "darwin" && p.bi.Arch.Name == "arm64" {
|
if p.bi.GOOS == "darwin" {
|
||||||
// There is no auxv on darwin, however, we can get the location of the mach-o
|
// There is no auxv on darwin, however, we can get the location of the mach-o
|
||||||
// header from the debugserver by going through the loaded libraries, which includes
|
// header from the debugserver by going through the loaded libraries, which includes
|
||||||
// the exe itself
|
// the exe itself
|
||||||
|
|||||||
Reference in New Issue
Block a user