X7ROOT File Manager
Current Path:
/opt/golang/1.22.0/src/cmd/link/internal/ld
opt
/
golang
/
1.22.0
/
src
/
cmd
/
link
/
internal
/
ld
/
📁
..
📄
ar.go
(7.15 KB)
📄
asmb.go
(5.44 KB)
📄
config.go
(5.64 KB)
📄
data.go
(99.49 KB)
📄
data_test.go
(2.27 KB)
📄
deadcode.go
(18.8 KB)
📄
deadcode_test.go
(1.69 KB)
📄
decodesym.go
(10.12 KB)
📄
dwarf.go
(72.42 KB)
📄
dwarf_test.go
(48.49 KB)
📄
elf.go
(63.2 KB)
📄
elf_test.go
(4.18 KB)
📄
errors.go
(1.89 KB)
📄
execarchive.go
(876 B)
📄
execarchive_noexec.go
(320 B)
📄
fallocate_test.go
(1.69 KB)
📄
go.go
(11.17 KB)
📄
go_test.go
(2.67 KB)
📄
heap.go
(1.89 KB)
📄
heap_test.go
(1.87 KB)
📄
inittask.go
(6.18 KB)
📄
issue33808_test.go
(792 B)
📄
ld.go
(7.98 KB)
📄
ld_test.go
(10.34 KB)
📄
lib.go
(86.45 KB)
📄
link.go
(5.13 KB)
📄
macho.go
(43.68 KB)
📄
macho_combine_dwarf.go
(13.1 KB)
📄
main.go
(15.99 KB)
📄
msync_darwin_libc.go
(307 B)
📄
nooptcgolink_test.go
(733 B)
📄
outbuf.go
(8.05 KB)
📄
outbuf_darwin.go
(1.35 KB)
📄
outbuf_freebsd.go
(515 B)
📄
outbuf_linux.go
(304 B)
📄
outbuf_mmap.go
(1.46 KB)
📄
outbuf_nofallocate.go
(301 B)
📄
outbuf_nommap.go
(741 B)
📄
outbuf_notdarwin.go
(236 B)
📄
outbuf_test.go
(2.21 KB)
📄
outbuf_windows.go
(2.31 KB)
📄
pcln.go
(29.75 KB)
📄
pe.go
(48.82 KB)
📄
seh.go
(2.05 KB)
📄
stackcheck.go
(11.88 KB)
📄
stackcheck_test.go
(2.25 KB)
📄
sym.go
(3.91 KB)
📄
symtab.go
(29.17 KB)
📄
target.go
(3.86 KB)
📁
testdata
📄
typelink.go
(1.87 KB)
📄
util.go
(2.5 KB)
📄
xcoff.go
(51.76 KB)
Editing: seh.go
// Copyright 2023 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. package ld import ( "cmd/internal/sys" "cmd/link/internal/loader" "cmd/link/internal/sym" ) var sehp struct { pdata []sym.LoaderSym xdata []sym.LoaderSym } func writeSEH(ctxt *Link) { switch ctxt.Arch.Family { case sys.AMD64: writeSEHAMD64(ctxt) } } func writeSEHAMD64(ctxt *Link) { ldr := ctxt.loader mkSecSym := func(name string, kind sym.SymKind) *loader.SymbolBuilder { s := ldr.CreateSymForUpdate(name, 0) s.SetType(kind) s.SetAlign(4) return s } pdata := mkSecSym(".pdata", sym.SSEHSECT) xdata := mkSecSym(".xdata", sym.SSEHSECT) // The .xdata entries have very low cardinality // as it only contains frame pointer operations, // which are very similar across functions. // These are referenced by .pdata entries using // an RVA, so it is possible, and binary-size wise, // to deduplicate .xdata entries. uwcache := make(map[string]int64) // aux symbol name --> .xdata offset for _, s := range ctxt.Textp { if fi := ldr.FuncInfo(s); !fi.Valid() { continue } uw := ldr.SEHUnwindSym(s) if uw == 0 { continue } name := ctxt.SymName(uw) off, cached := uwcache[name] if !cached { off = xdata.Size() uwcache[name] = off xdata.AddBytes(ldr.Data(uw)) // The SEH unwind data can contain relocations, // make sure those are copied over. rels := ldr.Relocs(uw) for i := 0; i < rels.Count(); i++ { r := rels.At(i) rel, _ := xdata.AddRel(r.Type()) rel.SetOff(int32(off) + r.Off()) rel.SetSiz(r.Siz()) rel.SetSym(r.Sym()) rel.SetAdd(r.Add()) } } // Reference: // https://learn.microsoft.com/en-us/cpp/build/exception-handling-x64#struct-runtime_function pdata.AddPEImageRelativeAddrPlus(ctxt.Arch, s, 0) pdata.AddPEImageRelativeAddrPlus(ctxt.Arch, s, ldr.SymSize(s)) pdata.AddPEImageRelativeAddrPlus(ctxt.Arch, xdata.Sym(), off) } sehp.pdata = append(sehp.pdata, pdata.Sym()) sehp.xdata = append(sehp.xdata, xdata.Sym()) }
Upload File
Create Folder