mirror of
https://github.com/golang/go
synced 2024-09-15 22:20:06 +00:00
cmd/internal/objabi, cmd/link: move linker-only symkind values into linker
Many (most!) of the values of objapi.SymKind are used only in the linker, so this creates a separate cmd/link/internal/ld.SymKind type, removes most values from SymKind and maps one to the other when reading object files in the linker. Two of the remaining objapi.SymKind values are only checked for, never set and so will never be actually found but I wanted to keep this to the most mechanical change possible. Change-Id: I4bbc5aed6713cab3e8de732e6e288eb77be0474c Reviewed-on: https://go-review.googlesource.com/40985 Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
b1868cf107
commit
be2ee2a4b4
|
@ -36,102 +36,28 @@ type SymKind int16
|
|||
// Defined SymKind values.
|
||||
//
|
||||
// TODO(rsc): Give idiomatic Go names.
|
||||
// TODO(rsc): Reduce the number of symbol types in the object files.
|
||||
//go:generate stringer -type=SymKind
|
||||
const (
|
||||
// An otherwise invalid zero value for the type
|
||||
Sxxx SymKind = iota
|
||||
// Executable instructions
|
||||
STEXT
|
||||
SELFRXSECT
|
||||
|
||||
// Read-only sections.
|
||||
STYPE
|
||||
SSTRING
|
||||
SGOSTRING
|
||||
SGOFUNC
|
||||
SGCBITS
|
||||
// Read only static data
|
||||
SRODATA
|
||||
SFUNCTAB
|
||||
|
||||
SELFROSECT
|
||||
SMACHOPLT
|
||||
|
||||
// Read-only sections with relocations.
|
||||
//
|
||||
// Types STYPE-SFUNCTAB above are written to the .rodata section by default.
|
||||
// When linking a shared object, some conceptually "read only" types need to
|
||||
// be written to by relocations and putting them in a section called
|
||||
// ".rodata" interacts poorly with the system linkers. The GNU linkers
|
||||
// support this situation by arranging for sections of the name
|
||||
// ".data.rel.ro.XXX" to be mprotected read only by the dynamic linker after
|
||||
// relocations have applied, so when the Go linker is creating a shared
|
||||
// object it checks all objects of the above types and bumps any object that
|
||||
// has a relocation to it to the corresponding type below, which are then
|
||||
// written to sections with appropriate magic names.
|
||||
STYPERELRO
|
||||
SSTRINGRELRO
|
||||
SGOSTRINGRELRO
|
||||
SGOFUNCRELRO
|
||||
SGCBITSRELRO
|
||||
SRODATARELRO
|
||||
SFUNCTABRELRO
|
||||
|
||||
// Part of .data.rel.ro if it exists, otherwise part of .rodata.
|
||||
STYPELINK
|
||||
SITABLINK
|
||||
SSYMTAB
|
||||
SPCLNTAB
|
||||
|
||||
// Writable sections.
|
||||
SELFSECT
|
||||
SMACHO
|
||||
SMACHOGOT
|
||||
SWINDOWS
|
||||
SELFGOT
|
||||
// Static data that does not contain any pointers
|
||||
SNOPTRDATA
|
||||
SINITARR
|
||||
// Static data
|
||||
SDATA
|
||||
// Statically data that is initially all 0s
|
||||
SBSS
|
||||
// Statically data that is initially all 0s and does not contain pointers
|
||||
SNOPTRBSS
|
||||
// Thread-local data that is initally all 0s
|
||||
STLSBSS
|
||||
// TODO(mwhudson): outside of the linker, these values are
|
||||
// only checked for, not set, so they should be removed.
|
||||
SXREF
|
||||
SMACHOSYMSTR
|
||||
SMACHOSYMTAB
|
||||
SMACHOINDIRECTPLT
|
||||
SMACHOINDIRECTGOT
|
||||
SFILE
|
||||
SFILEPATH
|
||||
SCONST
|
||||
SDYNIMPORT
|
||||
SHOSTOBJ
|
||||
SDWARFSECT
|
||||
// Debugging data
|
||||
SDWARFINFO
|
||||
SSUB = SymKind(1 << 8)
|
||||
SMASK = SymKind(SSUB - 1)
|
||||
SHIDDEN = SymKind(1 << 9)
|
||||
SCONTAINER = SymKind(1 << 10) // has a sub-symbol
|
||||
)
|
||||
|
||||
// ReadOnly are the symbol kinds that form read-only sections. In some
|
||||
// cases, if they will require relocations, they are transformed into
|
||||
// rel-ro sections using RelROMap.
|
||||
var ReadOnly = []SymKind{
|
||||
STYPE,
|
||||
SSTRING,
|
||||
SGOSTRING,
|
||||
SGOFUNC,
|
||||
SGCBITS,
|
||||
SRODATA,
|
||||
SFUNCTAB,
|
||||
}
|
||||
|
||||
// RelROMap describes the transformation of read-only symbols to rel-ro
|
||||
// symbols.
|
||||
var RelROMap = map[SymKind]SymKind{
|
||||
STYPE: STYPERELRO,
|
||||
SSTRING: SSTRINGRELRO,
|
||||
SGOSTRING: SGOSTRINGRELRO,
|
||||
SGOFUNC: SGOFUNCRELRO,
|
||||
SGCBITS: SGCBITSRELRO,
|
||||
SRODATA: SRODATARELRO,
|
||||
SFUNCTAB: SFUNCTABRELRO,
|
||||
}
|
||||
|
|
|
@ -4,9 +4,9 @@ package objabi
|
|||
|
||||
import "fmt"
|
||||
|
||||
const _SymKind_name = "SxxxSTEXTSELFRXSECTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSMACHOPLTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASBSSSNOPTRBSSSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILESFILEPATHSCONSTSDYNIMPORTSHOSTOBJSDWARFSECTSDWARFINFO"
|
||||
const _SymKind_name = "SxxxSTEXTSRODATASNOPTRDATASDATASBSSSNOPTRBSSSTLSBSSSXREFSCONSTSDWARFINFO"
|
||||
|
||||
var _SymKind_index = [...]uint16{0, 4, 9, 19, 24, 31, 40, 47, 54, 61, 69, 79, 88, 98, 110, 124, 136, 148, 160, 173, 182, 191, 198, 206, 214, 220, 229, 237, 244, 254, 262, 267, 271, 280, 287, 292, 304, 316, 333, 350, 355, 364, 370, 380, 388, 398, 408}
|
||||
var _SymKind_index = [...]uint8{0, 4, 9, 16, 26, 31, 35, 44, 51, 56, 62, 72}
|
||||
|
||||
func (i SymKind) String() string {
|
||||
if i < 0 || i >= SymKind(len(_SymKind_index)-1) {
|
||||
|
|
|
@ -45,15 +45,15 @@ func (f *goobjFile) symbols() ([]Sym, error) {
|
|||
seen[s.SymID] = true
|
||||
sym := Sym{Addr: uint64(s.Data.Offset), Name: goobjName(s.SymID), Size: int64(s.Size), Type: s.Type.Name, Code: '?'}
|
||||
switch s.Kind {
|
||||
case objabi.STEXT, objabi.SELFRXSECT:
|
||||
case objabi.STEXT:
|
||||
sym.Code = 'T'
|
||||
case objabi.STYPE, objabi.SSTRING, objabi.SGOSTRING, objabi.SGOFUNC, objabi.SRODATA, objabi.SFUNCTAB, objabi.STYPELINK, objabi.SITABLINK, objabi.SSYMTAB, objabi.SPCLNTAB, objabi.SELFROSECT:
|
||||
case objabi.SRODATA:
|
||||
sym.Code = 'R'
|
||||
case objabi.SMACHOPLT, objabi.SELFSECT, objabi.SMACHO, objabi.SMACHOGOT, objabi.SNOPTRDATA, objabi.SINITARR, objabi.SDATA, objabi.SWINDOWS:
|
||||
case objabi.SDATA:
|
||||
sym.Code = 'D'
|
||||
case objabi.SBSS, objabi.SNOPTRBSS, objabi.STLSBSS:
|
||||
sym.Code = 'B'
|
||||
case objabi.SXREF, objabi.SMACHOSYMSTR, objabi.SMACHOSYMTAB, objabi.SMACHOINDIRECTPLT, objabi.SMACHOINDIRECTGOT, objabi.SFILE, objabi.SFILEPATH, objabi.SCONST, objabi.SDYNIMPORT, objabi.SHOSTOBJ:
|
||||
case objabi.SXREF, objabi.SCONST:
|
||||
sym.Code = 'X' // should not see
|
||||
}
|
||||
if s.Version != 0 {
|
||||
|
|
|
@ -59,14 +59,14 @@ func gentext(ctxt *ld.Link) {
|
|||
return
|
||||
}
|
||||
addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0)
|
||||
if addmoduledata.Type == objabi.STEXT && ld.Buildmode != ld.BuildmodePlugin {
|
||||
if addmoduledata.Type == ld.STEXT && ld.Buildmode != ld.BuildmodePlugin {
|
||||
// we're linking a module containing the runtime -> no need for
|
||||
// an init function
|
||||
return
|
||||
}
|
||||
addmoduledata.Attr |= ld.AttrReachable
|
||||
initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0)
|
||||
initfunc.Type = objabi.STEXT
|
||||
initfunc.Type = ld.STEXT
|
||||
initfunc.Attr |= ld.AttrLocal
|
||||
initfunc.Attr |= ld.AttrReachable
|
||||
o := func(op ...uint8) {
|
||||
|
@ -92,7 +92,7 @@ func gentext(ctxt *ld.Link) {
|
|||
initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0)
|
||||
initarray_entry.Attr |= ld.AttrReachable
|
||||
initarray_entry.Attr |= ld.AttrLocal
|
||||
initarray_entry.Type = objabi.SINITARR
|
||||
initarray_entry.Type = ld.SINITARR
|
||||
ld.Addaddr(ctxt, initarray_entry, initfunc)
|
||||
}
|
||||
|
||||
|
@ -108,10 +108,10 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
|
||||
// Handle relocations found in ELF object files.
|
||||
case 256 + ld.R_X86_64_PC32:
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected R_X86_64_PC32 relocation for dynamic symbol %s", targ.Name)
|
||||
}
|
||||
if targ.Type == 0 || targ.Type == objabi.SXREF {
|
||||
if targ.Type == 0 || targ.Type == ld.SXREF {
|
||||
ld.Errorf(s, "unknown symbol %s in pcrel", targ.Name)
|
||||
}
|
||||
r.Type = objabi.R_PCREL
|
||||
|
@ -121,7 +121,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
case 256 + ld.R_X86_64_PLT32:
|
||||
r.Type = objabi.R_PCREL
|
||||
r.Add += 4
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
addpltsym(ctxt, targ)
|
||||
r.Sym = ctxt.Syms.Lookup(".plt", 0)
|
||||
r.Add += int64(targ.Plt)
|
||||
|
@ -130,7 +130,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
return true
|
||||
|
||||
case 256 + ld.R_X86_64_GOTPCREL, 256 + ld.R_X86_64_GOTPCRELX, 256 + ld.R_X86_64_REX_GOTPCRELX:
|
||||
if targ.Type != objabi.SDYNIMPORT {
|
||||
if targ.Type != ld.SDYNIMPORT {
|
||||
// have symbol
|
||||
if r.Off >= 2 && s.P[r.Off-2] == 0x8b {
|
||||
// turn MOVQ of GOT entry into LEAQ of symbol itself
|
||||
|
@ -153,7 +153,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
return true
|
||||
|
||||
case 256 + ld.R_X86_64_64:
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected R_X86_64_64 relocation for dynamic symbol %s", targ.Name)
|
||||
}
|
||||
r.Type = objabi.R_ADDR
|
||||
|
@ -166,13 +166,13 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
// TODO: What is the difference between all these?
|
||||
r.Type = objabi.R_ADDR
|
||||
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected reloc for dynamic symbol %s", targ.Name)
|
||||
}
|
||||
return true
|
||||
|
||||
case 512 + ld.MACHO_X86_64_RELOC_BRANCH*2 + 1:
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
addpltsym(ctxt, targ)
|
||||
r.Sym = ctxt.Syms.Lookup(".plt", 0)
|
||||
r.Add = int64(targ.Plt)
|
||||
|
@ -189,13 +189,13 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
512 + ld.MACHO_X86_64_RELOC_SIGNED_4*2 + 1:
|
||||
r.Type = objabi.R_PCREL
|
||||
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected pc-relative reloc for dynamic symbol %s", targ.Name)
|
||||
}
|
||||
return true
|
||||
|
||||
case 512 + ld.MACHO_X86_64_RELOC_GOT_LOAD*2 + 1:
|
||||
if targ.Type != objabi.SDYNIMPORT {
|
||||
if targ.Type != ld.SDYNIMPORT {
|
||||
// have symbol
|
||||
// turn MOVQ of GOT entry into LEAQ of symbol itself
|
||||
if r.Off < 2 || s.P[r.Off-2] != 0x8b {
|
||||
|
@ -211,7 +211,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
|
||||
// fall through
|
||||
case 512 + ld.MACHO_X86_64_RELOC_GOT*2 + 1:
|
||||
if targ.Type != objabi.SDYNIMPORT {
|
||||
if targ.Type != ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected GOT reloc for non-dynamic symbol %s", targ.Name)
|
||||
}
|
||||
addgotsym(ctxt, targ)
|
||||
|
@ -224,7 +224,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
switch r.Type {
|
||||
case objabi.R_CALL,
|
||||
objabi.R_PCREL:
|
||||
if targ.Type != objabi.SDYNIMPORT {
|
||||
if targ.Type != ld.SDYNIMPORT {
|
||||
// nothing to do, the relocation will be laid out in reloc
|
||||
return true
|
||||
}
|
||||
|
@ -240,7 +240,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
}
|
||||
|
||||
case objabi.R_ADDR:
|
||||
if s.Type == objabi.STEXT && ld.Iself {
|
||||
if s.Type == ld.STEXT && ld.Iself {
|
||||
if ld.Headtype == objabi.Hsolaris {
|
||||
addpltsym(ctxt, targ)
|
||||
r.Sym = ctxt.Syms.Lookup(".plt", 0)
|
||||
|
@ -294,7 +294,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
// linking, in which case the relocation will be
|
||||
// prepared in the 'reloc' phase and passed to the
|
||||
// external linker in the 'asmb' phase.
|
||||
if s.Type != objabi.SDATA && s.Type != objabi.SRODATA {
|
||||
if s.Type != ld.SDATA && s.Type != ld.SRODATA {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
@ -331,7 +331,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
ld.Adddynsym(ctxt, targ)
|
||||
|
||||
got := ctxt.Syms.Lookup(".got", 0)
|
||||
s.Type = got.Type | objabi.SSUB
|
||||
s.Type = got.Type | ld.SSUB
|
||||
s.Outer = got
|
||||
s.Sub = got.Sub
|
||||
got.Sub = s
|
||||
|
@ -384,7 +384,7 @@ func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
|
|||
|
||||
case objabi.R_CALL:
|
||||
if r.Siz == 4 {
|
||||
if r.Xsym.Type == objabi.SDYNIMPORT {
|
||||
if r.Xsym.Type == ld.SDYNIMPORT {
|
||||
if ctxt.DynlinkingGo() {
|
||||
ld.Thearch.Vput(ld.R_X86_64_PLT32 | uint64(elfsym)<<32)
|
||||
} else {
|
||||
|
@ -399,7 +399,7 @@ func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
|
|||
|
||||
case objabi.R_PCREL:
|
||||
if r.Siz == 4 {
|
||||
if r.Xsym.Type == objabi.SDYNIMPORT && r.Xsym.ElfType == elf.STT_FUNC {
|
||||
if r.Xsym.Type == ld.SDYNIMPORT && r.Xsym.ElfType == elf.STT_FUNC {
|
||||
ld.Thearch.Vput(ld.R_X86_64_PLT32 | uint64(elfsym)<<32)
|
||||
} else {
|
||||
ld.Thearch.Vput(ld.R_X86_64_PC32 | uint64(elfsym)<<32)
|
||||
|
@ -425,7 +425,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int {
|
|||
|
||||
rs := r.Xsym
|
||||
|
||||
if rs.Type == objabi.SHOSTOBJ || r.Type == objabi.R_PCREL || r.Type == objabi.R_GOTPCREL {
|
||||
if rs.Type == ld.SHOSTOBJ || r.Type == objabi.R_PCREL || r.Type == objabi.R_GOTPCREL {
|
||||
if rs.Dynid < 0 {
|
||||
ld.Errorf(s, "reloc %d to non-macho symbol %s type=%d", r.Type, rs.Name, rs.Type)
|
||||
return -1
|
||||
|
|
|
@ -63,14 +63,14 @@ func gentext(ctxt *ld.Link) {
|
|||
return
|
||||
}
|
||||
addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0)
|
||||
if addmoduledata.Type == objabi.STEXT && ld.Buildmode != ld.BuildmodePlugin {
|
||||
if addmoduledata.Type == ld.STEXT && ld.Buildmode != ld.BuildmodePlugin {
|
||||
// we're linking a module containing the runtime -> no need for
|
||||
// an init function
|
||||
return
|
||||
}
|
||||
addmoduledata.Attr |= ld.AttrReachable
|
||||
initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0)
|
||||
initfunc.Type = objabi.STEXT
|
||||
initfunc.Type = ld.STEXT
|
||||
initfunc.Attr |= ld.AttrLocal
|
||||
initfunc.Attr |= ld.AttrReachable
|
||||
o := func(op uint32) {
|
||||
|
@ -102,7 +102,7 @@ func gentext(ctxt *ld.Link) {
|
|||
initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0)
|
||||
initarray_entry.Attr |= ld.AttrReachable
|
||||
initarray_entry.Attr |= ld.AttrLocal
|
||||
initarray_entry.Type = objabi.SINITARR
|
||||
initarray_entry.Type = ld.SINITARR
|
||||
ld.Addaddr(ctxt, initarray_entry, initfunc)
|
||||
}
|
||||
|
||||
|
@ -126,7 +126,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
case 256 + ld.R_ARM_PLT32:
|
||||
r.Type = objabi.R_CALLARM
|
||||
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
addpltsym(ctxt, targ)
|
||||
r.Sym = ctxt.Syms.Lookup(".plt", 0)
|
||||
r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
|
||||
|
@ -139,7 +139,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
return false
|
||||
|
||||
case 256 + ld.R_ARM_GOT32: // R_ARM_GOT_BREL
|
||||
if targ.Type != objabi.SDYNIMPORT {
|
||||
if targ.Type != ld.SDYNIMPORT {
|
||||
addgotsyminternal(ctxt, targ)
|
||||
} else {
|
||||
addgotsym(ctxt, targ)
|
||||
|
@ -151,7 +151,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
return true
|
||||
|
||||
case 256 + ld.R_ARM_GOT_PREL: // GOT(nil) + A - nil
|
||||
if targ.Type != objabi.SDYNIMPORT {
|
||||
if targ.Type != ld.SDYNIMPORT {
|
||||
addgotsyminternal(ctxt, targ)
|
||||
} else {
|
||||
addgotsym(ctxt, targ)
|
||||
|
@ -176,7 +176,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
|
||||
case 256 + ld.R_ARM_CALL:
|
||||
r.Type = objabi.R_CALLARM
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
addpltsym(ctxt, targ)
|
||||
r.Sym = ctxt.Syms.Lookup(".plt", 0)
|
||||
r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
|
||||
|
@ -191,7 +191,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
return true
|
||||
|
||||
case 256 + ld.R_ARM_ABS32:
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected R_ARM_ABS32 relocation for dynamic symbol %s", targ.Name)
|
||||
}
|
||||
r.Type = objabi.R_ADDR
|
||||
|
@ -210,7 +210,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
case 256 + ld.R_ARM_PC24,
|
||||
256 + ld.R_ARM_JUMP24:
|
||||
r.Type = objabi.R_CALLARM
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
addpltsym(ctxt, targ)
|
||||
r.Sym = ctxt.Syms.Lookup(".plt", 0)
|
||||
r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
|
||||
|
@ -220,7 +220,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
}
|
||||
|
||||
// Handle references to ELF symbols from our own object files.
|
||||
if targ.Type != objabi.SDYNIMPORT {
|
||||
if targ.Type != ld.SDYNIMPORT {
|
||||
return true
|
||||
}
|
||||
|
||||
|
@ -232,7 +232,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
return true
|
||||
|
||||
case objabi.R_ADDR:
|
||||
if s.Type != objabi.SDATA {
|
||||
if s.Type != ld.SDATA {
|
||||
break
|
||||
}
|
||||
if ld.Iself {
|
||||
|
@ -332,7 +332,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int {
|
|||
rs := r.Xsym
|
||||
|
||||
if r.Type == objabi.R_PCREL {
|
||||
if rs.Type == objabi.SHOSTOBJ {
|
||||
if rs.Type == ld.SHOSTOBJ {
|
||||
ld.Errorf(s, "pc-relative relocation of external symbol is not supported")
|
||||
return -1
|
||||
}
|
||||
|
@ -361,7 +361,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int {
|
|||
return 0
|
||||
}
|
||||
|
||||
if rs.Type == objabi.SHOSTOBJ || r.Type == objabi.R_CALLARM {
|
||||
if rs.Type == ld.SHOSTOBJ || r.Type == objabi.R_CALLARM {
|
||||
if rs.Dynid < 0 {
|
||||
ld.Errorf(s, "reloc %d to non-macho symbol %s type=%d", r.Type, rs.Name, rs.Type)
|
||||
return -1
|
||||
|
@ -443,7 +443,7 @@ func trampoline(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol) {
|
|||
for i := 0; ; i++ {
|
||||
name := r.Sym.Name + fmt.Sprintf("%+d-tramp%d", offset, i)
|
||||
tramp = ctxt.Syms.Lookup(name, int(r.Sym.Version))
|
||||
if tramp.Type == objabi.SDYNIMPORT {
|
||||
if tramp.Type == ld.SDYNIMPORT {
|
||||
// don't reuse trampoline defined in other module
|
||||
continue
|
||||
}
|
||||
|
@ -584,7 +584,7 @@ func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
|
|||
rs = rs.Outer
|
||||
}
|
||||
|
||||
if rs.Type != objabi.SHOSTOBJ && rs.Type != objabi.SDYNIMPORT && rs.Sect == nil {
|
||||
if rs.Type != ld.SHOSTOBJ && rs.Type != ld.SDYNIMPORT && rs.Sect == nil {
|
||||
ld.Errorf(s, "missing section for %s", rs.Name)
|
||||
}
|
||||
r.Xsym = rs
|
||||
|
|
|
@ -43,14 +43,14 @@ func gentext(ctxt *ld.Link) {
|
|||
return
|
||||
}
|
||||
addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0)
|
||||
if addmoduledata.Type == objabi.STEXT {
|
||||
if addmoduledata.Type == ld.STEXT {
|
||||
// we're linking a module containing the runtime -> no need for
|
||||
// an init function
|
||||
return
|
||||
}
|
||||
addmoduledata.Attr |= ld.AttrReachable
|
||||
initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0)
|
||||
initfunc.Type = objabi.STEXT
|
||||
initfunc.Type = ld.STEXT
|
||||
initfunc.Attr |= ld.AttrLocal
|
||||
initfunc.Attr |= ld.AttrReachable
|
||||
o := func(op uint32) {
|
||||
|
@ -82,7 +82,7 @@ func gentext(ctxt *ld.Link) {
|
|||
initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0)
|
||||
initarray_entry.Attr |= ld.AttrReachable
|
||||
initarray_entry.Attr |= ld.AttrLocal
|
||||
initarray_entry.Type = objabi.SINITARR
|
||||
initarray_entry.Type = ld.SINITARR
|
||||
ld.Addaddr(ctxt, initarray_entry, initfunc)
|
||||
}
|
||||
|
||||
|
@ -156,7 +156,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int {
|
|||
// ld64 has a bug handling MACHO_ARM64_RELOC_UNSIGNED with !extern relocation.
|
||||
// see cmd/internal/ld/data.go for details. The workaround is that don't use !extern
|
||||
// UNSIGNED relocation at all.
|
||||
if rs.Type == objabi.SHOSTOBJ || r.Type == objabi.R_CALLARM64 || r.Type == objabi.R_ADDRARM64 || r.Type == objabi.R_ADDR {
|
||||
if rs.Type == ld.SHOSTOBJ || r.Type == objabi.R_CALLARM64 || r.Type == objabi.R_ADDRARM64 || r.Type == objabi.R_ADDR {
|
||||
if rs.Dynid < 0 {
|
||||
ld.Errorf(s, "reloc %d to non-macho symbol %s type=%d", r.Type, rs.Name, rs.Type)
|
||||
return -1
|
||||
|
@ -250,7 +250,7 @@ func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
|
|||
// (https://sourceware.org/bugzilla/show_bug.cgi?id=18270). So
|
||||
// we convert the adrp; ld64 + R_ARM64_GOTPCREL into adrp;
|
||||
// add + R_ADDRARM64.
|
||||
if !(r.Sym.Version != 0 || (r.Sym.Type&objabi.SHIDDEN != 0) || r.Sym.Attr.Local()) && r.Sym.Type == objabi.STEXT && ctxt.DynlinkingGo() {
|
||||
if !(r.Sym.Version != 0 || (r.Sym.Type&ld.SHIDDEN != 0) || r.Sym.Attr.Local()) && r.Sym.Type == ld.STEXT && ctxt.DynlinkingGo() {
|
||||
if o2&0xffc00000 != 0xf9400000 {
|
||||
ld.Errorf(s, "R_ARM64_GOTPCREL against unexpected instruction %x", o2)
|
||||
}
|
||||
|
@ -275,7 +275,7 @@ func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
|
|||
rs = rs.Outer
|
||||
}
|
||||
|
||||
if rs.Type != objabi.SHOSTOBJ && rs.Type != objabi.SDYNIMPORT && rs.Sect == nil {
|
||||
if rs.Type != ld.SHOSTOBJ && rs.Type != ld.SDYNIMPORT && rs.Sect == nil {
|
||||
ld.Errorf(s, "missing section for %s", rs.Name)
|
||||
}
|
||||
r.Xsym = rs
|
||||
|
|
|
@ -101,7 +101,7 @@ func hostArchive(ctxt *Link, name string) {
|
|||
var load []uint64
|
||||
for _, s := range ctxt.Syms.Allsym {
|
||||
for _, r := range s.R {
|
||||
if r.Sym != nil && r.Sym.Type&objabi.SMASK == objabi.SXREF {
|
||||
if r.Sym != nil && r.Sym.Type&SMASK == SXREF {
|
||||
if off := armap[r.Sym.Name]; off != 0 && !loaded[off] {
|
||||
load = append(load, off)
|
||||
loaded[off] = true
|
||||
|
|
|
@ -65,7 +65,7 @@ func Addrel(s *Symbol) *Reloc {
|
|||
|
||||
func setuintxx(ctxt *Link, s *Symbol, off int64, v uint64, wid int64) int64 {
|
||||
if s.Type == 0 {
|
||||
s.Type = objabi.SDATA
|
||||
s.Type = SDATA
|
||||
}
|
||||
s.Attr |= AttrReachable
|
||||
if s.Size < off+wid {
|
||||
|
@ -89,7 +89,7 @@ func setuintxx(ctxt *Link, s *Symbol, off int64, v uint64, wid int64) int64 {
|
|||
|
||||
func Addbytes(s *Symbol, bytes []byte) int64 {
|
||||
if s.Type == 0 {
|
||||
s.Type = objabi.SDATA
|
||||
s.Type = SDATA
|
||||
}
|
||||
s.Attr |= AttrReachable
|
||||
s.P = append(s.P, bytes...)
|
||||
|
@ -107,7 +107,7 @@ func adduintxx(ctxt *Link, s *Symbol, v uint64, wid int) int64 {
|
|||
func Adduint8(ctxt *Link, s *Symbol, v uint8) int64 {
|
||||
off := s.Size
|
||||
if s.Type == 0 {
|
||||
s.Type = objabi.SDATA
|
||||
s.Type = SDATA
|
||||
}
|
||||
s.Attr |= AttrReachable
|
||||
s.Size++
|
||||
|
@ -146,7 +146,7 @@ func setuint(ctxt *Link, s *Symbol, r int64, v uint64) int64 {
|
|||
|
||||
func Addaddrplus(ctxt *Link, s *Symbol, t *Symbol, add int64) int64 {
|
||||
if s.Type == 0 {
|
||||
s.Type = objabi.SDATA
|
||||
s.Type = SDATA
|
||||
}
|
||||
s.Attr |= AttrReachable
|
||||
i := s.Size
|
||||
|
@ -163,7 +163,7 @@ func Addaddrplus(ctxt *Link, s *Symbol, t *Symbol, add int64) int64 {
|
|||
|
||||
func Addpcrelplus(ctxt *Link, s *Symbol, t *Symbol, add int64) int64 {
|
||||
if s.Type == 0 {
|
||||
s.Type = objabi.SDATA
|
||||
s.Type = SDATA
|
||||
}
|
||||
s.Attr |= AttrReachable
|
||||
i := s.Size
|
||||
|
@ -187,7 +187,7 @@ func Addaddr(ctxt *Link, s *Symbol, t *Symbol) int64 {
|
|||
|
||||
func setaddrplus(ctxt *Link, s *Symbol, off int64, t *Symbol, add int64) int64 {
|
||||
if s.Type == 0 {
|
||||
s.Type = objabi.SDATA
|
||||
s.Type = SDATA
|
||||
}
|
||||
s.Attr |= AttrReachable
|
||||
if off+int64(ctxt.Arch.PtrSize) > s.Size {
|
||||
|
@ -210,7 +210,7 @@ func setaddr(ctxt *Link, s *Symbol, off int64, t *Symbol) int64 {
|
|||
|
||||
func addsize(ctxt *Link, s *Symbol, t *Symbol) int64 {
|
||||
if s.Type == 0 {
|
||||
s.Type = objabi.SDATA
|
||||
s.Type = SDATA
|
||||
}
|
||||
s.Attr |= AttrReachable
|
||||
i := s.Size
|
||||
|
@ -226,7 +226,7 @@ func addsize(ctxt *Link, s *Symbol, t *Symbol) int64 {
|
|||
|
||||
func addaddrplus4(ctxt *Link, s *Symbol, t *Symbol, add int64) int64 {
|
||||
if s.Type == 0 {
|
||||
s.Type = objabi.SDATA
|
||||
s.Type = SDATA
|
||||
}
|
||||
s.Attr |= AttrReachable
|
||||
i := s.Size
|
||||
|
@ -345,7 +345,7 @@ func trampoline(ctxt *Link, s *Symbol) {
|
|||
if !r.Type.IsDirectJump() {
|
||||
continue
|
||||
}
|
||||
if Symaddr(r.Sym) == 0 && r.Sym.Type != objabi.SDYNIMPORT {
|
||||
if Symaddr(r.Sym) == 0 && r.Sym.Type != SDYNIMPORT {
|
||||
if r.Sym.File != s.File {
|
||||
if !isRuntimeDepPkg(s.File) || !isRuntimeDepPkg(r.Sym.File) {
|
||||
Errorf(s, "unresolved inter-package jump to %s(%s)", r.Sym, r.Sym.File)
|
||||
|
@ -386,12 +386,12 @@ func relocsym(ctxt *Link, s *Symbol) {
|
|||
continue
|
||||
}
|
||||
|
||||
if r.Sym != nil && (r.Sym.Type&(objabi.SMASK|objabi.SHIDDEN) == 0 || r.Sym.Type&objabi.SMASK == objabi.SXREF) {
|
||||
if r.Sym != nil && (r.Sym.Type&(SMASK|SHIDDEN) == 0 || r.Sym.Type&SMASK == SXREF) {
|
||||
// When putting the runtime but not main into a shared library
|
||||
// these symbols are undefined and that's OK.
|
||||
if Buildmode == BuildmodeShared {
|
||||
if r.Sym.Name == "main.main" || r.Sym.Name == "main.init" {
|
||||
r.Sym.Type = objabi.SDYNIMPORT
|
||||
r.Sym.Type = SDYNIMPORT
|
||||
} else if strings.HasPrefix(r.Sym.Name, "go.info.") {
|
||||
// Skip go.info symbols. They are only needed to communicate
|
||||
// DWARF info between the compiler and linker.
|
||||
|
@ -412,12 +412,12 @@ func relocsym(ctxt *Link, s *Symbol) {
|
|||
|
||||
// We need to be able to reference dynimport symbols when linking against
|
||||
// shared libraries, and Solaris needs it always
|
||||
if Headtype != objabi.Hsolaris && r.Sym != nil && r.Sym.Type == objabi.SDYNIMPORT && !ctxt.DynlinkingGo() {
|
||||
if Headtype != objabi.Hsolaris && r.Sym != nil && r.Sym.Type == SDYNIMPORT && !ctxt.DynlinkingGo() {
|
||||
if !(SysArch.Family == sys.PPC64 && Linkmode == LinkExternal && r.Sym.Name == ".TOC.") {
|
||||
Errorf(s, "unhandled relocation for %s (type %d rtype %d)", r.Sym.Name, r.Sym.Type, r.Type)
|
||||
}
|
||||
}
|
||||
if r.Sym != nil && r.Sym.Type != objabi.STLSBSS && r.Type != objabi.R_WEAKADDROFF && !r.Sym.Attr.Reachable() {
|
||||
if r.Sym != nil && r.Sym.Type != STLSBSS && r.Type != objabi.R_WEAKADDROFF && !r.Sym.Attr.Reachable() {
|
||||
Errorf(s, "unreachable sym in relocation: %s", r.Sym.Name)
|
||||
}
|
||||
|
||||
|
@ -516,7 +516,7 @@ func relocsym(ctxt *Link, s *Symbol) {
|
|||
}
|
||||
|
||||
case objabi.R_ADDR:
|
||||
if Linkmode == LinkExternal && r.Sym.Type != objabi.SCONST {
|
||||
if Linkmode == LinkExternal && r.Sym.Type != SCONST {
|
||||
r.Done = 0
|
||||
|
||||
// set up addend for eventual relocation via outer symbol.
|
||||
|
@ -528,7 +528,7 @@ func relocsym(ctxt *Link, s *Symbol) {
|
|||
rs = rs.Outer
|
||||
}
|
||||
|
||||
if rs.Type != objabi.SHOSTOBJ && rs.Type != objabi.SDYNIMPORT && rs.Sect == nil {
|
||||
if rs.Type != SHOSTOBJ && rs.Type != SDYNIMPORT && rs.Sect == nil {
|
||||
Errorf(s, "missing section for relocation target %s", rs.Name)
|
||||
}
|
||||
r.Xsym = rs
|
||||
|
@ -544,7 +544,7 @@ func relocsym(ctxt *Link, s *Symbol) {
|
|||
// table, then it will add o twice into the relocated value.
|
||||
// The workaround is that on arm64 don't ever add symaddr to o and always use
|
||||
// extern relocation by requiring rs->dynid >= 0.
|
||||
if rs.Type != objabi.SHOSTOBJ {
|
||||
if rs.Type != SHOSTOBJ {
|
||||
if SysArch.Family == sys.ARM64 && rs.Dynid < 0 {
|
||||
Errorf(s, "R_ADDR reloc to %s+%d is not supported on darwin/arm64", rs.Name, o)
|
||||
}
|
||||
|
@ -616,7 +616,7 @@ func relocsym(ctxt *Link, s *Symbol) {
|
|||
|
||||
// r->sym can be null when CALL $(constant) is transformed from absolute PC to relative PC call.
|
||||
case objabi.R_GOTPCREL:
|
||||
if ctxt.DynlinkingGo() && Headtype == objabi.Hdarwin && r.Sym != nil && r.Sym.Type != objabi.SCONST {
|
||||
if ctxt.DynlinkingGo() && Headtype == objabi.Hdarwin && r.Sym != nil && r.Sym.Type != SCONST {
|
||||
r.Done = 0
|
||||
r.Xadd = r.Add
|
||||
r.Xadd -= int64(r.Siz) // relative to address after the relocated chunk
|
||||
|
@ -628,7 +628,7 @@ func relocsym(ctxt *Link, s *Symbol) {
|
|||
}
|
||||
fallthrough
|
||||
case objabi.R_CALL, objabi.R_PCREL:
|
||||
if Linkmode == LinkExternal && r.Sym != nil && r.Sym.Type != objabi.SCONST && (r.Sym.Sect != s.Sect || r.Type == objabi.R_GOTPCREL) {
|
||||
if Linkmode == LinkExternal && r.Sym != nil && r.Sym.Type != SCONST && (r.Sym.Sect != s.Sect || r.Type == objabi.R_GOTPCREL) {
|
||||
r.Done = 0
|
||||
|
||||
// set up addend for eventual relocation via outer symbol.
|
||||
|
@ -641,7 +641,7 @@ func relocsym(ctxt *Link, s *Symbol) {
|
|||
}
|
||||
|
||||
r.Xadd -= int64(r.Siz) // relative to address after the relocated chunk
|
||||
if rs.Type != objabi.SHOSTOBJ && rs.Type != objabi.SDYNIMPORT && rs.Sect == nil {
|
||||
if rs.Type != SHOSTOBJ && rs.Type != SDYNIMPORT && rs.Sect == nil {
|
||||
Errorf(s, "missing section for relocation target %s", rs.Name)
|
||||
}
|
||||
r.Xsym = rs
|
||||
|
@ -653,7 +653,7 @@ func relocsym(ctxt *Link, s *Symbol) {
|
|||
}
|
||||
} else if Headtype == objabi.Hdarwin {
|
||||
if r.Type == objabi.R_CALL {
|
||||
if rs.Type != objabi.SHOSTOBJ {
|
||||
if rs.Type != SHOSTOBJ {
|
||||
o += int64(uint64(Symaddr(rs)) - rs.Sect.Vaddr)
|
||||
}
|
||||
o -= int64(r.Off) // relative to section offset, not symbol
|
||||
|
@ -803,7 +803,7 @@ func dynrelocsym(ctxt *Link, s *Symbol) {
|
|||
Thearch.Adddynrel(ctxt, s, r)
|
||||
continue
|
||||
}
|
||||
if r.Sym != nil && r.Sym.Type == objabi.SDYNIMPORT || r.Type >= 256 {
|
||||
if r.Sym != nil && r.Sym.Type == SDYNIMPORT || r.Type >= 256 {
|
||||
if r.Sym != nil && !r.Sym.Attr.Reachable() {
|
||||
Errorf(s, "dynamic relocation to unreachable symbol %s", r.Sym.Name)
|
||||
}
|
||||
|
@ -814,7 +814,7 @@ func dynrelocsym(ctxt *Link, s *Symbol) {
|
|||
}
|
||||
}
|
||||
|
||||
func dynreloc(ctxt *Link, data *[objabi.SXREF][]*Symbol) {
|
||||
func dynreloc(ctxt *Link, data *[SXREF][]*Symbol) {
|
||||
// -d suppresses dynamic loader format, so we may as well not
|
||||
// compute these sections or mark their symbols as reachable.
|
||||
if *FlagD && Headtype != objabi.Hwindows {
|
||||
|
@ -906,7 +906,7 @@ func CodeblkPad(ctxt *Link, addr int64, size int64, pad []byte) {
|
|||
|
||||
func blk(ctxt *Link, syms []*Symbol, addr, size int64, pad []byte) {
|
||||
for i, s := range syms {
|
||||
if s.Type&objabi.SSUB == 0 && s.Value >= addr {
|
||||
if s.Type&SSUB == 0 && s.Value >= addr {
|
||||
syms = syms[i:]
|
||||
break
|
||||
}
|
||||
|
@ -914,7 +914,7 @@ func blk(ctxt *Link, syms []*Symbol, addr, size int64, pad []byte) {
|
|||
|
||||
eaddr := addr + size
|
||||
for _, s := range syms {
|
||||
if s.Type&objabi.SSUB != 0 {
|
||||
if s.Type&SSUB != 0 {
|
||||
continue
|
||||
}
|
||||
if s.Value >= eaddr {
|
||||
|
@ -1071,7 +1071,7 @@ func addstrdata(ctxt *Link, name string, value string) {
|
|||
sp := ctxt.Syms.Lookup(p, 0)
|
||||
|
||||
Addstring(sp, value)
|
||||
sp.Type = objabi.SRODATA
|
||||
sp.Type = SRODATA
|
||||
|
||||
s := ctxt.Syms.Lookup(name, 0)
|
||||
s.Size = 0
|
||||
|
@ -1092,7 +1092,7 @@ func addstrdata(ctxt *Link, name string, value string) {
|
|||
|
||||
func (ctxt *Link) checkstrdata() {
|
||||
for _, s := range strdata {
|
||||
if s.Type == objabi.STEXT {
|
||||
if s.Type == STEXT {
|
||||
Errorf(s, "cannot use -X with text symbol")
|
||||
} else if s.Gotype != nil && s.Gotype.Name != "type.string" {
|
||||
Errorf(s, "cannot use -X with non-string symbol")
|
||||
|
@ -1102,7 +1102,7 @@ func (ctxt *Link) checkstrdata() {
|
|||
|
||||
func Addstring(s *Symbol, str string) int64 {
|
||||
if s.Type == 0 {
|
||||
s.Type = objabi.SNOPTRDATA
|
||||
s.Type = SNOPTRDATA
|
||||
}
|
||||
s.Attr |= AttrReachable
|
||||
r := s.Size
|
||||
|
@ -1119,12 +1119,12 @@ func Addstring(s *Symbol, str string) int64 {
|
|||
// symbol used to define the string data and must be unique per linked object.
|
||||
func addgostring(ctxt *Link, s *Symbol, symname, str string) {
|
||||
sym := ctxt.Syms.Lookup(symname, 0)
|
||||
if sym.Type != objabi.Sxxx {
|
||||
if sym.Type != Sxxx {
|
||||
Errorf(s, "duplicate symname in addgostring: %s", symname)
|
||||
}
|
||||
sym.Attr |= AttrReachable
|
||||
sym.Attr |= AttrLocal
|
||||
sym.Type = objabi.SRODATA
|
||||
sym.Type = SRODATA
|
||||
sym.Size = int64(len(str))
|
||||
sym.P = []byte(str)
|
||||
Addaddr(ctxt, s, sym)
|
||||
|
@ -1134,7 +1134,7 @@ func addgostring(ctxt *Link, s *Symbol, symname, str string) {
|
|||
func addinitarrdata(ctxt *Link, s *Symbol) {
|
||||
p := s.Name + ".ptr"
|
||||
sp := ctxt.Syms.Lookup(p, 0)
|
||||
sp.Type = objabi.SINITARR
|
||||
sp.Type = SINITARR
|
||||
sp.Size = 0
|
||||
sp.Attr |= AttrDuplicateOK
|
||||
Addaddr(ctxt, sp, s)
|
||||
|
@ -1143,11 +1143,11 @@ func addinitarrdata(ctxt *Link, s *Symbol) {
|
|||
func dosymtype(ctxt *Link) {
|
||||
for _, s := range ctxt.Syms.Allsym {
|
||||
if len(s.P) > 0 {
|
||||
if s.Type == objabi.SBSS {
|
||||
s.Type = objabi.SDATA
|
||||
if s.Type == SBSS {
|
||||
s.Type = SDATA
|
||||
}
|
||||
if s.Type == objabi.SNOPTRBSS {
|
||||
s.Type = objabi.SNOPTRDATA
|
||||
if s.Type == SNOPTRBSS {
|
||||
s.Type = SNOPTRDATA
|
||||
}
|
||||
}
|
||||
// Create a new entry in the .init_array section that points to the
|
||||
|
@ -1279,7 +1279,7 @@ func (d bySizeAndName) Less(i, j int) bool {
|
|||
|
||||
const cutoff int64 = 2e9 // 2 GB (or so; looks better in errors than 2^31)
|
||||
|
||||
func checkdatsize(ctxt *Link, datsize int64, symn objabi.SymKind) {
|
||||
func checkdatsize(ctxt *Link, datsize int64, symn SymKind) {
|
||||
if datsize > cutoff {
|
||||
Errorf(nil, "too much data in section %v (over %d bytes)", symn, cutoff)
|
||||
}
|
||||
|
@ -1325,22 +1325,22 @@ func (ctxt *Link) dodata() {
|
|||
ctxt.Syms.Lookup("runtime.edata", 0).Attr.Set(AttrSpecial, false)
|
||||
|
||||
types := ctxt.Syms.Lookup("runtime.types", 0)
|
||||
types.Type = objabi.STYPE
|
||||
types.Type = STYPE
|
||||
types.Size = 8
|
||||
types.Attr.Set(AttrSpecial, false)
|
||||
|
||||
etypes := ctxt.Syms.Lookup("runtime.etypes", 0)
|
||||
etypes.Type = objabi.SFUNCTAB
|
||||
etypes.Type = SFUNCTAB
|
||||
etypes.Attr.Set(AttrSpecial, false)
|
||||
}
|
||||
|
||||
// Collect data symbols by type into data.
|
||||
var data [objabi.SXREF][]*Symbol
|
||||
var data [SXREF][]*Symbol
|
||||
for _, s := range ctxt.Syms.Allsym {
|
||||
if !s.Attr.Reachable() || s.Attr.Special() {
|
||||
continue
|
||||
}
|
||||
if s.Type <= objabi.STEXT || s.Type >= objabi.SXREF {
|
||||
if s.Type <= STEXT || s.Type >= SXREF {
|
||||
continue
|
||||
}
|
||||
data[s.Type] = append(data[s.Type], s)
|
||||
|
@ -1361,8 +1361,8 @@ func (ctxt *Link) dodata() {
|
|||
// "read only" data with relocations needs to go in its own section
|
||||
// when building a shared library. We do this by boosting objects of
|
||||
// type SXXX with relocations to type SXXXRELRO.
|
||||
for _, symnro := range objabi.ReadOnly {
|
||||
symnrelro := objabi.RelROMap[symnro]
|
||||
for _, symnro := range ReadOnly {
|
||||
symnrelro := RelROMap[symnro]
|
||||
|
||||
ro := []*Symbol{}
|
||||
relro := data[symnrelro]
|
||||
|
@ -1370,7 +1370,7 @@ func (ctxt *Link) dodata() {
|
|||
for _, s := range data[symnro] {
|
||||
isRelro := len(s.R) > 0
|
||||
switch s.Type {
|
||||
case objabi.STYPE, objabi.STYPERELRO, objabi.SGOFUNCRELRO:
|
||||
case STYPE, STYPERELRO, SGOFUNCRELRO:
|
||||
// Symbols are not sorted yet, so it is possible
|
||||
// that an Outer symbol has been changed to a
|
||||
// relro Type before it reaches here.
|
||||
|
@ -1404,10 +1404,10 @@ func (ctxt *Link) dodata() {
|
|||
}
|
||||
|
||||
// Sort symbols.
|
||||
var dataMaxAlign [objabi.SXREF]int32
|
||||
var dataMaxAlign [SXREF]int32
|
||||
var wg sync.WaitGroup
|
||||
for symn := range data {
|
||||
symn := objabi.SymKind(symn)
|
||||
symn := SymKind(symn)
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
data[symn], dataMaxAlign[symn] = dodataSect(ctxt, symn, data[symn])
|
||||
|
@ -1423,11 +1423,11 @@ func (ctxt *Link) dodata() {
|
|||
datsize := int64(0)
|
||||
|
||||
// Writable data sections that do not need any specialized handling.
|
||||
writable := []objabi.SymKind{
|
||||
objabi.SELFSECT,
|
||||
objabi.SMACHO,
|
||||
objabi.SMACHOGOT,
|
||||
objabi.SWINDOWS,
|
||||
writable := []SymKind{
|
||||
SELFSECT,
|
||||
SMACHO,
|
||||
SMACHOGOT,
|
||||
SWINDOWS,
|
||||
}
|
||||
for _, symn := range writable {
|
||||
for _, s := range data[symn] {
|
||||
|
@ -1436,7 +1436,7 @@ func (ctxt *Link) dodata() {
|
|||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SDATA
|
||||
s.Type = SDATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
datsize += s.Size
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
|
@ -1445,16 +1445,16 @@ func (ctxt *Link) dodata() {
|
|||
}
|
||||
|
||||
// .got (and .toc on ppc64)
|
||||
if len(data[objabi.SELFGOT]) > 0 {
|
||||
if len(data[SELFGOT]) > 0 {
|
||||
sect := addsection(&Segdata, ".got", 06)
|
||||
sect.Align = dataMaxAlign[objabi.SELFGOT]
|
||||
sect.Align = dataMaxAlign[SELFGOT]
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
var toc *Symbol
|
||||
for _, s := range data[objabi.SELFGOT] {
|
||||
for _, s := range data[SELFGOT] {
|
||||
datsize = aligndatsize(datsize, s)
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SDATA
|
||||
s.Type = SDATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
|
||||
// Resolve .TOC. symbol for this object file (ppc64)
|
||||
|
@ -1470,25 +1470,25 @@ func (ctxt *Link) dodata() {
|
|||
|
||||
datsize += s.Size
|
||||
}
|
||||
checkdatsize(ctxt, datsize, objabi.SELFGOT)
|
||||
checkdatsize(ctxt, datsize, SELFGOT)
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
}
|
||||
|
||||
/* pointer-free data */
|
||||
sect := addsection(&Segdata, ".noptrdata", 06)
|
||||
sect.Align = dataMaxAlign[objabi.SNOPTRDATA]
|
||||
sect.Align = dataMaxAlign[SNOPTRDATA]
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
ctxt.Syms.Lookup("runtime.noptrdata", 0).Sect = sect
|
||||
ctxt.Syms.Lookup("runtime.enoptrdata", 0).Sect = sect
|
||||
for _, s := range data[objabi.SNOPTRDATA] {
|
||||
for _, s := range data[SNOPTRDATA] {
|
||||
datsize = aligndatsize(datsize, s)
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SDATA
|
||||
s.Type = SDATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
datsize += s.Size
|
||||
}
|
||||
checkdatsize(ctxt, datsize, objabi.SNOPTRDATA)
|
||||
checkdatsize(ctxt, datsize, SNOPTRDATA)
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
|
||||
hasinitarr := *FlagLinkshared
|
||||
|
@ -1500,68 +1500,68 @@ func (ctxt *Link) dodata() {
|
|||
}
|
||||
if hasinitarr {
|
||||
sect := addsection(&Segdata, ".init_array", 06)
|
||||
sect.Align = dataMaxAlign[objabi.SINITARR]
|
||||
sect.Align = dataMaxAlign[SINITARR]
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
for _, s := range data[objabi.SINITARR] {
|
||||
for _, s := range data[SINITARR] {
|
||||
datsize = aligndatsize(datsize, s)
|
||||
s.Sect = sect
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
datsize += s.Size
|
||||
}
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
checkdatsize(ctxt, datsize, objabi.SINITARR)
|
||||
checkdatsize(ctxt, datsize, SINITARR)
|
||||
}
|
||||
|
||||
/* data */
|
||||
sect = addsection(&Segdata, ".data", 06)
|
||||
sect.Align = dataMaxAlign[objabi.SDATA]
|
||||
sect.Align = dataMaxAlign[SDATA]
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
ctxt.Syms.Lookup("runtime.data", 0).Sect = sect
|
||||
ctxt.Syms.Lookup("runtime.edata", 0).Sect = sect
|
||||
var gc GCProg
|
||||
gc.Init(ctxt, "runtime.gcdata")
|
||||
for _, s := range data[objabi.SDATA] {
|
||||
for _, s := range data[SDATA] {
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SDATA
|
||||
s.Type = SDATA
|
||||
datsize = aligndatsize(datsize, s)
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
gc.AddSym(s)
|
||||
datsize += s.Size
|
||||
}
|
||||
checkdatsize(ctxt, datsize, objabi.SDATA)
|
||||
checkdatsize(ctxt, datsize, SDATA)
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
gc.End(int64(sect.Length))
|
||||
|
||||
/* bss */
|
||||
sect = addsection(&Segdata, ".bss", 06)
|
||||
sect.Align = dataMaxAlign[objabi.SBSS]
|
||||
sect.Align = dataMaxAlign[SBSS]
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
ctxt.Syms.Lookup("runtime.bss", 0).Sect = sect
|
||||
ctxt.Syms.Lookup("runtime.ebss", 0).Sect = sect
|
||||
gc = GCProg{}
|
||||
gc.Init(ctxt, "runtime.gcbss")
|
||||
for _, s := range data[objabi.SBSS] {
|
||||
for _, s := range data[SBSS] {
|
||||
s.Sect = sect
|
||||
datsize = aligndatsize(datsize, s)
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
gc.AddSym(s)
|
||||
datsize += s.Size
|
||||
}
|
||||
checkdatsize(ctxt, datsize, objabi.SBSS)
|
||||
checkdatsize(ctxt, datsize, SBSS)
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
gc.End(int64(sect.Length))
|
||||
|
||||
/* pointer-free bss */
|
||||
sect = addsection(&Segdata, ".noptrbss", 06)
|
||||
sect.Align = dataMaxAlign[objabi.SNOPTRBSS]
|
||||
sect.Align = dataMaxAlign[SNOPTRBSS]
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
ctxt.Syms.Lookup("runtime.noptrbss", 0).Sect = sect
|
||||
ctxt.Syms.Lookup("runtime.enoptrbss", 0).Sect = sect
|
||||
for _, s := range data[objabi.SNOPTRBSS] {
|
||||
for _, s := range data[SNOPTRBSS] {
|
||||
datsize = aligndatsize(datsize, s)
|
||||
s.Sect = sect
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
|
@ -1570,9 +1570,9 @@ func (ctxt *Link) dodata() {
|
|||
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
ctxt.Syms.Lookup("runtime.end", 0).Sect = sect
|
||||
checkdatsize(ctxt, datsize, objabi.SNOPTRBSS)
|
||||
checkdatsize(ctxt, datsize, SNOPTRBSS)
|
||||
|
||||
if len(data[objabi.STLSBSS]) > 0 {
|
||||
if len(data[STLSBSS]) > 0 {
|
||||
var sect *Section
|
||||
if Iself && (Linkmode == LinkExternal || !*FlagD) {
|
||||
sect = addsection(&Segdata, ".tbss", 06)
|
||||
|
@ -1581,13 +1581,13 @@ func (ctxt *Link) dodata() {
|
|||
}
|
||||
datsize = 0
|
||||
|
||||
for _, s := range data[objabi.STLSBSS] {
|
||||
for _, s := range data[STLSBSS] {
|
||||
datsize = aligndatsize(datsize, s)
|
||||
s.Sect = sect
|
||||
s.Value = datsize
|
||||
datsize += s.Size
|
||||
}
|
||||
checkdatsize(ctxt, datsize, objabi.STLSBSS)
|
||||
checkdatsize(ctxt, datsize, STLSBSS)
|
||||
|
||||
if sect != nil {
|
||||
sect.Length = uint64(datsize)
|
||||
|
@ -1614,20 +1614,20 @@ func (ctxt *Link) dodata() {
|
|||
datsize = 0
|
||||
|
||||
/* read-only executable ELF, Mach-O sections */
|
||||
if len(data[objabi.STEXT]) != 0 {
|
||||
Errorf(nil, "dodata found an STEXT symbol: %s", data[objabi.STEXT][0].Name)
|
||||
if len(data[STEXT]) != 0 {
|
||||
Errorf(nil, "dodata found an STEXT symbol: %s", data[STEXT][0].Name)
|
||||
}
|
||||
for _, s := range data[objabi.SELFRXSECT] {
|
||||
for _, s := range data[SELFRXSECT] {
|
||||
sect := addsection(&Segtext, s.Name, 04)
|
||||
sect.Align = symalign(s)
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
datsize += s.Size
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
checkdatsize(ctxt, datsize, objabi.SELFRXSECT)
|
||||
checkdatsize(ctxt, datsize, SELFRXSECT)
|
||||
}
|
||||
|
||||
/* read-only data */
|
||||
|
@ -1640,18 +1640,18 @@ func (ctxt *Link) dodata() {
|
|||
ctxt.Syms.Lookup("runtime.types", 0).Sect = sect
|
||||
ctxt.Syms.Lookup("runtime.etypes", 0).Sect = sect
|
||||
}
|
||||
for _, symn := range objabi.ReadOnly {
|
||||
for _, symn := range ReadOnly {
|
||||
align := dataMaxAlign[symn]
|
||||
if sect.Align < align {
|
||||
sect.Align = align
|
||||
}
|
||||
}
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
for _, symn := range objabi.ReadOnly {
|
||||
for _, symn := range ReadOnly {
|
||||
for _, s := range data[symn] {
|
||||
datsize = aligndatsize(datsize, s)
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
datsize += s.Size
|
||||
}
|
||||
|
@ -1660,31 +1660,31 @@ func (ctxt *Link) dodata() {
|
|||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
|
||||
/* read-only ELF, Mach-O sections */
|
||||
for _, s := range data[objabi.SELFROSECT] {
|
||||
for _, s := range data[SELFROSECT] {
|
||||
sect = addsection(segro, s.Name, 04)
|
||||
sect.Align = symalign(s)
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
datsize += s.Size
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
}
|
||||
checkdatsize(ctxt, datsize, objabi.SELFROSECT)
|
||||
checkdatsize(ctxt, datsize, SELFROSECT)
|
||||
|
||||
for _, s := range data[objabi.SMACHOPLT] {
|
||||
for _, s := range data[SMACHOPLT] {
|
||||
sect = addsection(segro, s.Name, 04)
|
||||
sect.Align = symalign(s)
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
datsize += s.Size
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
}
|
||||
checkdatsize(ctxt, datsize, objabi.SMACHOPLT)
|
||||
checkdatsize(ctxt, datsize, SMACHOPLT)
|
||||
|
||||
// There is some data that are conceptually read-only but are written to by
|
||||
// relocations. On GNU systems, we can arrange for the dynamic linker to
|
||||
|
@ -1720,23 +1720,23 @@ func (ctxt *Link) dodata() {
|
|||
sect.Vaddr = 0
|
||||
ctxt.Syms.Lookup("runtime.types", 0).Sect = sect
|
||||
ctxt.Syms.Lookup("runtime.etypes", 0).Sect = sect
|
||||
for _, symnro := range objabi.ReadOnly {
|
||||
symn := objabi.RelROMap[symnro]
|
||||
for _, symnro := range ReadOnly {
|
||||
symn := RelROMap[symnro]
|
||||
align := dataMaxAlign[symn]
|
||||
if sect.Align < align {
|
||||
sect.Align = align
|
||||
}
|
||||
}
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
for _, symnro := range objabi.ReadOnly {
|
||||
symn := objabi.RelROMap[symnro]
|
||||
for _, symnro := range ReadOnly {
|
||||
symn := RelROMap[symnro]
|
||||
for _, s := range data[symn] {
|
||||
datsize = aligndatsize(datsize, s)
|
||||
if s.Outer != nil && s.Outer.Sect != nil && s.Outer.Sect != sect {
|
||||
Errorf(s, "s.Outer (%s) in different section from s, %s != %s", s.Outer.Name, s.Outer.Sect.Name, sect.Name)
|
||||
}
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
datsize += s.Size
|
||||
}
|
||||
|
@ -1748,65 +1748,65 @@ func (ctxt *Link) dodata() {
|
|||
|
||||
/* typelink */
|
||||
sect = addrelrosection(".typelink")
|
||||
sect.Align = dataMaxAlign[objabi.STYPELINK]
|
||||
sect.Align = dataMaxAlign[STYPELINK]
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
typelink := ctxt.Syms.Lookup("runtime.typelink", 0)
|
||||
typelink.Sect = sect
|
||||
typelink.Type = objabi.SRODATA
|
||||
typelink.Type = SRODATA
|
||||
datsize += typelink.Size
|
||||
checkdatsize(ctxt, datsize, objabi.STYPELINK)
|
||||
checkdatsize(ctxt, datsize, STYPELINK)
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
|
||||
/* itablink */
|
||||
sect = addrelrosection(".itablink")
|
||||
sect.Align = dataMaxAlign[objabi.SITABLINK]
|
||||
sect.Align = dataMaxAlign[SITABLINK]
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
ctxt.Syms.Lookup("runtime.itablink", 0).Sect = sect
|
||||
ctxt.Syms.Lookup("runtime.eitablink", 0).Sect = sect
|
||||
for _, s := range data[objabi.SITABLINK] {
|
||||
for _, s := range data[SITABLINK] {
|
||||
datsize = aligndatsize(datsize, s)
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
datsize += s.Size
|
||||
}
|
||||
checkdatsize(ctxt, datsize, objabi.SITABLINK)
|
||||
checkdatsize(ctxt, datsize, SITABLINK)
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
|
||||
/* gosymtab */
|
||||
sect = addrelrosection(".gosymtab")
|
||||
sect.Align = dataMaxAlign[objabi.SSYMTAB]
|
||||
sect.Align = dataMaxAlign[SSYMTAB]
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
ctxt.Syms.Lookup("runtime.symtab", 0).Sect = sect
|
||||
ctxt.Syms.Lookup("runtime.esymtab", 0).Sect = sect
|
||||
for _, s := range data[objabi.SSYMTAB] {
|
||||
for _, s := range data[SSYMTAB] {
|
||||
datsize = aligndatsize(datsize, s)
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
datsize += s.Size
|
||||
}
|
||||
checkdatsize(ctxt, datsize, objabi.SSYMTAB)
|
||||
checkdatsize(ctxt, datsize, SSYMTAB)
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
|
||||
/* gopclntab */
|
||||
sect = addrelrosection(".gopclntab")
|
||||
sect.Align = dataMaxAlign[objabi.SPCLNTAB]
|
||||
sect.Align = dataMaxAlign[SPCLNTAB]
|
||||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
ctxt.Syms.Lookup("runtime.pclntab", 0).Sect = sect
|
||||
ctxt.Syms.Lookup("runtime.epclntab", 0).Sect = sect
|
||||
for _, s := range data[objabi.SPCLNTAB] {
|
||||
for _, s := range data[SPCLNTAB] {
|
||||
datsize = aligndatsize(datsize, s)
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
datsize += s.Size
|
||||
}
|
||||
checkdatsize(ctxt, datsize, objabi.SRODATA)
|
||||
checkdatsize(ctxt, datsize, SRODATA)
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
|
||||
// 6g uses 4-byte relocation offsets, so the entire segment must fit in 32 bits.
|
||||
|
@ -1814,7 +1814,7 @@ func (ctxt *Link) dodata() {
|
|||
Errorf(nil, "read-only data segment too large: %d", datsize)
|
||||
}
|
||||
|
||||
for symn := objabi.SELFRXSECT; symn < objabi.SXREF; symn++ {
|
||||
for symn := SELFRXSECT; symn < SXREF; symn++ {
|
||||
datap = append(datap, data[symn]...)
|
||||
}
|
||||
|
||||
|
@ -1823,7 +1823,7 @@ func (ctxt *Link) dodata() {
|
|||
var s *Symbol
|
||||
var i int
|
||||
for i, s = range dwarfp {
|
||||
if s.Type != objabi.SDWARFSECT {
|
||||
if s.Type != SDWARFSECT {
|
||||
break
|
||||
}
|
||||
sect = addsection(&Segdwarf, s.Name, 04)
|
||||
|
@ -1831,12 +1831,12 @@ func (ctxt *Link) dodata() {
|
|||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
datsize += s.Size
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
}
|
||||
checkdatsize(ctxt, datsize, objabi.SDWARFSECT)
|
||||
checkdatsize(ctxt, datsize, SDWARFSECT)
|
||||
|
||||
if i < len(dwarfp) {
|
||||
sect = addsection(&Segdwarf, ".debug_info", 04)
|
||||
|
@ -1844,17 +1844,17 @@ func (ctxt *Link) dodata() {
|
|||
datsize = Rnd(datsize, int64(sect.Align))
|
||||
sect.Vaddr = uint64(datsize)
|
||||
for _, s := range dwarfp[i:] {
|
||||
if s.Type != objabi.SDWARFINFO {
|
||||
if s.Type != SDWARFINFO {
|
||||
break
|
||||
}
|
||||
s.Sect = sect
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Value = int64(uint64(datsize) - sect.Vaddr)
|
||||
s.Attr |= AttrLocal
|
||||
datsize += s.Size
|
||||
}
|
||||
sect.Length = uint64(datsize) - sect.Vaddr
|
||||
checkdatsize(ctxt, datsize, objabi.SDWARFINFO)
|
||||
checkdatsize(ctxt, datsize, SDWARFINFO)
|
||||
}
|
||||
|
||||
/* number the sections */
|
||||
|
@ -1882,7 +1882,7 @@ func (ctxt *Link) dodata() {
|
|||
}
|
||||
}
|
||||
|
||||
func dodataSect(ctxt *Link, symn objabi.SymKind, syms []*Symbol) (result []*Symbol, maxAlign int32) {
|
||||
func dodataSect(ctxt *Link, symn SymKind, syms []*Symbol) (result []*Symbol, maxAlign int32) {
|
||||
if Headtype == objabi.Hdarwin {
|
||||
// Some symbols may no longer belong in syms
|
||||
// due to movement in machosymorder.
|
||||
|
@ -1932,7 +1932,7 @@ func dodataSect(ctxt *Link, symn objabi.SymKind, syms []*Symbol) (result []*Symb
|
|||
}
|
||||
|
||||
switch s.Type {
|
||||
case objabi.SELFGOT:
|
||||
case SELFGOT:
|
||||
// For ppc64, we want to interleave the .got and .toc sections
|
||||
// from input files. Both are type SELFGOT, so in that case
|
||||
// we skip size comparison and fall through to the name
|
||||
|
@ -1961,7 +1961,7 @@ func dodataSect(ctxt *Link, symn objabi.SymKind, syms []*Symbol) (result []*Symb
|
|||
syms[len(syms)-1] = tail
|
||||
}
|
||||
|
||||
if Iself && symn == objabi.SELFROSECT {
|
||||
if Iself && symn == SELFROSECT {
|
||||
// Make .rela and .rela.plt contiguous, the ELF ABI requires this
|
||||
// and Solaris actually cares.
|
||||
reli, plti := -1, -1
|
||||
|
@ -2012,7 +2012,7 @@ func (ctxt *Link) textbuildid() {
|
|||
// The \xff is invalid UTF-8, meant to make it less likely
|
||||
// to find one of these accidentally.
|
||||
data := "\xff Go build ID: " + strconv.Quote(*flagBuildid) + "\n \xff"
|
||||
sym.Type = objabi.STEXT
|
||||
sym.Type = STEXT
|
||||
sym.P = []byte(data)
|
||||
sym.Size = int64(len(sym.P))
|
||||
|
||||
|
@ -2084,7 +2084,7 @@ func (ctxt *Link) textaddress() {
|
|||
// will not need to create new text sections, and so no need to return sect and n.
|
||||
func assignAddress(ctxt *Link, sect *Section, n int, sym *Symbol, va uint64) (*Section, int, uint64) {
|
||||
sym.Sect = sect
|
||||
if sym.Type&objabi.SSUB != 0 {
|
||||
if sym.Type&SSUB != 0 {
|
||||
return sect, n, va
|
||||
}
|
||||
if sym.Align != 0 {
|
||||
|
@ -2303,8 +2303,8 @@ func (ctxt *Link) address() {
|
|||
s.Value = int64(sectSym.Sect.Vaddr + 16)
|
||||
}
|
||||
|
||||
ctxt.xdefine("runtime.text", objabi.STEXT, int64(text.Vaddr))
|
||||
ctxt.xdefine("runtime.etext", objabi.STEXT, int64(lasttext.Vaddr+lasttext.Length))
|
||||
ctxt.xdefine("runtime.text", STEXT, int64(text.Vaddr))
|
||||
ctxt.xdefine("runtime.etext", STEXT, int64(lasttext.Vaddr+lasttext.Length))
|
||||
|
||||
// If there are multiple text sections, create runtime.text.n for
|
||||
// their section Vaddr, using n for index
|
||||
|
@ -2312,48 +2312,48 @@ func (ctxt *Link) address() {
|
|||
for _, sect := range Segtext.Sections[1:] {
|
||||
if sect.Name == ".text" {
|
||||
symname := fmt.Sprintf("runtime.text.%d", n)
|
||||
ctxt.xdefine(symname, objabi.STEXT, int64(sect.Vaddr))
|
||||
ctxt.xdefine(symname, STEXT, int64(sect.Vaddr))
|
||||
n++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
ctxt.xdefine("runtime.rodata", objabi.SRODATA, int64(rodata.Vaddr))
|
||||
ctxt.xdefine("runtime.erodata", objabi.SRODATA, int64(rodata.Vaddr+rodata.Length))
|
||||
ctxt.xdefine("runtime.types", objabi.SRODATA, int64(types.Vaddr))
|
||||
ctxt.xdefine("runtime.etypes", objabi.SRODATA, int64(types.Vaddr+types.Length))
|
||||
ctxt.xdefine("runtime.itablink", objabi.SRODATA, int64(itablink.Vaddr))
|
||||
ctxt.xdefine("runtime.eitablink", objabi.SRODATA, int64(itablink.Vaddr+itablink.Length))
|
||||
ctxt.xdefine("runtime.rodata", SRODATA, int64(rodata.Vaddr))
|
||||
ctxt.xdefine("runtime.erodata", SRODATA, int64(rodata.Vaddr+rodata.Length))
|
||||
ctxt.xdefine("runtime.types", SRODATA, int64(types.Vaddr))
|
||||
ctxt.xdefine("runtime.etypes", SRODATA, int64(types.Vaddr+types.Length))
|
||||
ctxt.xdefine("runtime.itablink", SRODATA, int64(itablink.Vaddr))
|
||||
ctxt.xdefine("runtime.eitablink", SRODATA, int64(itablink.Vaddr+itablink.Length))
|
||||
|
||||
sym := ctxt.Syms.Lookup("runtime.gcdata", 0)
|
||||
sym.Attr |= AttrLocal
|
||||
ctxt.xdefine("runtime.egcdata", objabi.SRODATA, Symaddr(sym)+sym.Size)
|
||||
ctxt.xdefine("runtime.egcdata", SRODATA, Symaddr(sym)+sym.Size)
|
||||
ctxt.Syms.Lookup("runtime.egcdata", 0).Sect = sym.Sect
|
||||
|
||||
sym = ctxt.Syms.Lookup("runtime.gcbss", 0)
|
||||
sym.Attr |= AttrLocal
|
||||
ctxt.xdefine("runtime.egcbss", objabi.SRODATA, Symaddr(sym)+sym.Size)
|
||||
ctxt.xdefine("runtime.egcbss", SRODATA, Symaddr(sym)+sym.Size)
|
||||
ctxt.Syms.Lookup("runtime.egcbss", 0).Sect = sym.Sect
|
||||
|
||||
ctxt.xdefine("runtime.symtab", objabi.SRODATA, int64(symtab.Vaddr))
|
||||
ctxt.xdefine("runtime.esymtab", objabi.SRODATA, int64(symtab.Vaddr+symtab.Length))
|
||||
ctxt.xdefine("runtime.pclntab", objabi.SRODATA, int64(pclntab.Vaddr))
|
||||
ctxt.xdefine("runtime.epclntab", objabi.SRODATA, int64(pclntab.Vaddr+pclntab.Length))
|
||||
ctxt.xdefine("runtime.noptrdata", objabi.SNOPTRDATA, int64(noptr.Vaddr))
|
||||
ctxt.xdefine("runtime.enoptrdata", objabi.SNOPTRDATA, int64(noptr.Vaddr+noptr.Length))
|
||||
ctxt.xdefine("runtime.bss", objabi.SBSS, int64(bss.Vaddr))
|
||||
ctxt.xdefine("runtime.ebss", objabi.SBSS, int64(bss.Vaddr+bss.Length))
|
||||
ctxt.xdefine("runtime.data", objabi.SDATA, int64(data.Vaddr))
|
||||
ctxt.xdefine("runtime.edata", objabi.SDATA, int64(data.Vaddr+data.Length))
|
||||
ctxt.xdefine("runtime.noptrbss", objabi.SNOPTRBSS, int64(noptrbss.Vaddr))
|
||||
ctxt.xdefine("runtime.enoptrbss", objabi.SNOPTRBSS, int64(noptrbss.Vaddr+noptrbss.Length))
|
||||
ctxt.xdefine("runtime.end", objabi.SBSS, int64(Segdata.Vaddr+Segdata.Length))
|
||||
ctxt.xdefine("runtime.symtab", SRODATA, int64(symtab.Vaddr))
|
||||
ctxt.xdefine("runtime.esymtab", SRODATA, int64(symtab.Vaddr+symtab.Length))
|
||||
ctxt.xdefine("runtime.pclntab", SRODATA, int64(pclntab.Vaddr))
|
||||
ctxt.xdefine("runtime.epclntab", SRODATA, int64(pclntab.Vaddr+pclntab.Length))
|
||||
ctxt.xdefine("runtime.noptrdata", SNOPTRDATA, int64(noptr.Vaddr))
|
||||
ctxt.xdefine("runtime.enoptrdata", SNOPTRDATA, int64(noptr.Vaddr+noptr.Length))
|
||||
ctxt.xdefine("runtime.bss", SBSS, int64(bss.Vaddr))
|
||||
ctxt.xdefine("runtime.ebss", SBSS, int64(bss.Vaddr+bss.Length))
|
||||
ctxt.xdefine("runtime.data", SDATA, int64(data.Vaddr))
|
||||
ctxt.xdefine("runtime.edata", SDATA, int64(data.Vaddr+data.Length))
|
||||
ctxt.xdefine("runtime.noptrbss", SNOPTRBSS, int64(noptrbss.Vaddr))
|
||||
ctxt.xdefine("runtime.enoptrbss", SNOPTRBSS, int64(noptrbss.Vaddr+noptrbss.Length))
|
||||
ctxt.xdefine("runtime.end", SBSS, int64(Segdata.Vaddr+Segdata.Length))
|
||||
}
|
||||
|
||||
// add a trampoline with symbol s (to be laid down after the current function)
|
||||
func (ctxt *Link) AddTramp(s *Symbol) {
|
||||
s.Type = objabi.STEXT
|
||||
s.Type = STEXT
|
||||
s.Attr |= AttrReachable
|
||||
s.Attr |= AttrOnList
|
||||
ctxt.tramps = append(ctxt.tramps, s)
|
||||
|
|
|
@ -208,7 +208,7 @@ func (d *deadcodepass) init() {
|
|||
// Mark all symbols defined in this library as reachable when
|
||||
// building a shared library.
|
||||
for _, s := range d.ctxt.Syms.Allsym {
|
||||
if s.Type != 0 && s.Type != objabi.SDYNIMPORT {
|
||||
if s.Type != 0 && s.Type != SDYNIMPORT {
|
||||
d.mark(s, nil)
|
||||
}
|
||||
}
|
||||
|
@ -246,7 +246,7 @@ func (d *deadcodepass) flood() {
|
|||
for len(d.markQueue) > 0 {
|
||||
s := d.markQueue[0]
|
||||
d.markQueue = d.markQueue[1:]
|
||||
if s.Type == objabi.STEXT {
|
||||
if s.Type == STEXT {
|
||||
if d.ctxt.Debugvlog > 1 {
|
||||
d.ctxt.Logf("marktext %s\n", s.Name)
|
||||
}
|
||||
|
|
|
@ -104,7 +104,7 @@ func findShlibSection(ctxt *Link, path string, addr uint64) *elf.Section {
|
|||
|
||||
// Type.commonType.gc
|
||||
func decodetypeGcprog(ctxt *Link, s *Symbol) []byte {
|
||||
if s.Type == objabi.SDYNIMPORT {
|
||||
if s.Type == SDYNIMPORT {
|
||||
addr := decodetypeGcprogShlib(ctxt, s)
|
||||
sect := findShlibSection(ctxt, s.File, addr)
|
||||
if sect != nil {
|
||||
|
@ -135,7 +135,7 @@ func decodetypeGcprogShlib(ctxt *Link, s *Symbol) uint64 {
|
|||
}
|
||||
|
||||
func decodetypeGcmask(ctxt *Link, s *Symbol) []byte {
|
||||
if s.Type == objabi.SDYNIMPORT {
|
||||
if s.Type == SDYNIMPORT {
|
||||
addr := decodetypeGcprogShlib(ctxt, s)
|
||||
ptrdata := decodetypePtrdata(ctxt.Arch, s)
|
||||
sect := findShlibSection(ctxt, s.File, addr)
|
||||
|
|
|
@ -83,7 +83,7 @@ var dwarfp []*Symbol
|
|||
|
||||
func writeabbrev(ctxt *Link, syms []*Symbol) []*Symbol {
|
||||
s := ctxt.Syms.Lookup(".debug_abbrev", 0)
|
||||
s.Type = objabi.SDWARFSECT
|
||||
s.Type = SDWARFSECT
|
||||
abbrevsym = s
|
||||
Addbytes(s, dwarf.GetAbbrev())
|
||||
return append(syms, s)
|
||||
|
@ -148,7 +148,7 @@ func newdie(ctxt *Link, parent *dwarf.DWDie, abbrev int, name string, version in
|
|||
if abbrev != dwarf.DW_ABRV_VARIABLE || version == 0 {
|
||||
sym := ctxt.Syms.Lookup(dwarf.InfoPrefix+name, version)
|
||||
sym.Attr |= AttrHidden
|
||||
sym.Type = objabi.SDWARFINFO
|
||||
sym.Type = SDWARFINFO
|
||||
die.Sym = sym
|
||||
}
|
||||
}
|
||||
|
@ -202,7 +202,7 @@ func find(ctxt *Link, name string) *Symbol {
|
|||
// The string allocation below is optimized away because it is only used in a map lookup.
|
||||
s := ctxt.Syms.ROLookup(string(n), 0)
|
||||
prefixBuf = n[:len(dwarf.InfoPrefix)]
|
||||
if s != nil && s.Type == objabi.SDWARFINFO {
|
||||
if s != nil && s.Type == SDWARFINFO {
|
||||
return s
|
||||
}
|
||||
return nil
|
||||
|
@ -340,7 +340,7 @@ func dotypedef(ctxt *Link, parent *dwarf.DWDie, name string, def *dwarf.DWDie) {
|
|||
|
||||
sym := ctxt.Syms.Lookup(dtolsym(def.Sym).Name+"..def", 0)
|
||||
sym.Attr |= AttrHidden
|
||||
sym.Type = objabi.SDWARFINFO
|
||||
sym.Type = SDWARFINFO
|
||||
def.Sym = sym
|
||||
|
||||
// The typedef entry must be created after the def,
|
||||
|
@ -660,7 +660,7 @@ func mkinternaltype(ctxt *Link, abbrev int, typename, keyname, valname string, f
|
|||
name := mkinternaltypename(typename, keyname, valname)
|
||||
symname := dwarf.InfoPrefix + name
|
||||
s := ctxt.Syms.ROLookup(symname, 0)
|
||||
if s != nil && s.Type == objabi.SDWARFINFO {
|
||||
if s != nil && s.Type == SDWARFINFO {
|
||||
return s
|
||||
}
|
||||
die := newdie(ctxt, &dwtypes, abbrev, name, 0)
|
||||
|
@ -996,7 +996,7 @@ func writelines(ctxt *Link, syms []*Symbol) ([]*Symbol, []*Symbol) {
|
|||
if linesec == nil {
|
||||
linesec = ctxt.Syms.Lookup(".debug_line", 0)
|
||||
}
|
||||
linesec.Type = objabi.SDWARFSECT
|
||||
linesec.Type = SDWARFSECT
|
||||
linesec.R = linesec.R[:0]
|
||||
|
||||
ls := linesec
|
||||
|
@ -1082,7 +1082,7 @@ func writelines(ctxt *Link, syms []*Symbol) ([]*Symbol, []*Symbol) {
|
|||
|
||||
dsym := ctxt.Syms.Lookup(dwarf.InfoPrefix+s.Name, int(s.Version))
|
||||
dsym.Attr |= AttrHidden | AttrReachable
|
||||
dsym.Type = objabi.SDWARFINFO
|
||||
dsym.Type = SDWARFINFO
|
||||
for _, r := range dsym.R {
|
||||
if r.Type == objabi.R_DWARFREF && r.Sym.Size == 0 {
|
||||
if Buildmode == BuildmodeShared {
|
||||
|
@ -1179,7 +1179,7 @@ func writeframes(ctxt *Link, syms []*Symbol) []*Symbol {
|
|||
if framesec == nil {
|
||||
framesec = ctxt.Syms.Lookup(".debug_frame", 0)
|
||||
}
|
||||
framesec.Type = objabi.SDWARFSECT
|
||||
framesec.Type = SDWARFSECT
|
||||
framesec.R = framesec.R[:0]
|
||||
fs := framesec
|
||||
syms = append(syms, fs)
|
||||
|
@ -1301,7 +1301,7 @@ func writeinfo(ctxt *Link, syms []*Symbol, funcs []*Symbol) []*Symbol {
|
|||
infosec = ctxt.Syms.Lookup(".debug_info", 0)
|
||||
}
|
||||
infosec.R = infosec.R[:0]
|
||||
infosec.Type = objabi.SDWARFINFO
|
||||
infosec.Type = SDWARFINFO
|
||||
infosec.Attr |= AttrReachable
|
||||
syms = append(syms, infosec)
|
||||
|
||||
|
@ -1367,7 +1367,7 @@ func ispubtype(die *dwarf.DWDie) bool {
|
|||
|
||||
func writepub(ctxt *Link, sname string, ispub func(*dwarf.DWDie) bool, syms []*Symbol) []*Symbol {
|
||||
s := ctxt.Syms.Lookup(sname, 0)
|
||||
s.Type = objabi.SDWARFSECT
|
||||
s.Type = SDWARFSECT
|
||||
syms = append(syms, s)
|
||||
|
||||
for compunit := dwroot.Child; compunit != nil; compunit = compunit.Link {
|
||||
|
@ -1407,7 +1407,7 @@ func writepub(ctxt *Link, sname string, ispub func(*dwarf.DWDie) bool, syms []*S
|
|||
*/
|
||||
func writearanges(ctxt *Link, syms []*Symbol) []*Symbol {
|
||||
s := ctxt.Syms.Lookup(".debug_aranges", 0)
|
||||
s.Type = objabi.SDWARFSECT
|
||||
s.Type = SDWARFSECT
|
||||
// The first tuple is aligned to a multiple of the size of a single tuple
|
||||
// (twice the size of an address)
|
||||
headersize := int(Rnd(4+2+4+1+1, int64(SysArch.PtrSize*2))) // don't count unit_length field itself
|
||||
|
@ -1451,7 +1451,7 @@ func writegdbscript(ctxt *Link, syms []*Symbol) []*Symbol {
|
|||
|
||||
if gdbscript != "" {
|
||||
s := ctxt.Syms.Lookup(".debug_gdb_scripts", 0)
|
||||
s.Type = objabi.SDWARFSECT
|
||||
s.Type = SDWARFSECT
|
||||
syms = append(syms, s)
|
||||
Adduint8(ctxt, s, 1) // magic 1 byte?
|
||||
Addstring(s, gdbscript)
|
||||
|
|
|
@ -1451,7 +1451,7 @@ func elfdynhash(ctxt *Link) {
|
|||
|
||||
nsym := Nelfsym
|
||||
s := ctxt.Syms.Lookup(".hash", 0)
|
||||
s.Type = objabi.SELFROSECT
|
||||
s.Type = SELFROSECT
|
||||
s.Attr |= AttrReachable
|
||||
|
||||
i := nsym
|
||||
|
@ -1856,7 +1856,7 @@ func Elfemitreloc(ctxt *Link) {
|
|||
func addgonote(ctxt *Link, sectionName string, tag uint32, desc []byte) {
|
||||
s := ctxt.Syms.Lookup(sectionName, 0)
|
||||
s.Attr |= AttrReachable
|
||||
s.Type = objabi.SELFROSECT
|
||||
s.Type = SELFROSECT
|
||||
// namesz
|
||||
Adduint32(ctxt, s, uint32(len(ELF_NOTE_GO_NAME)))
|
||||
// descsz
|
||||
|
@ -1884,7 +1884,7 @@ func (ctxt *Link) doelf() {
|
|||
/* predefine strings we need for section headers */
|
||||
shstrtab := ctxt.Syms.Lookup(".shstrtab", 0)
|
||||
|
||||
shstrtab.Type = objabi.SELFROSECT
|
||||
shstrtab.Type = SELFROSECT
|
||||
shstrtab.Attr |= AttrReachable
|
||||
|
||||
Addstring(shstrtab, "")
|
||||
|
@ -1992,7 +1992,7 @@ func (ctxt *Link) doelf() {
|
|||
/* dynamic symbol table - first entry all zeros */
|
||||
s := ctxt.Syms.Lookup(".dynsym", 0)
|
||||
|
||||
s.Type = objabi.SELFROSECT
|
||||
s.Type = SELFROSECT
|
||||
s.Attr |= AttrReachable
|
||||
if elf64 {
|
||||
s.Size += ELF64SYMSIZE
|
||||
|
@ -2003,7 +2003,7 @@ func (ctxt *Link) doelf() {
|
|||
/* dynamic string table */
|
||||
s = ctxt.Syms.Lookup(".dynstr", 0)
|
||||
|
||||
s.Type = objabi.SELFROSECT
|
||||
s.Type = SELFROSECT
|
||||
s.Attr |= AttrReachable
|
||||
if s.Size == 0 {
|
||||
Addstring(s, "")
|
||||
|
@ -2013,30 +2013,30 @@ func (ctxt *Link) doelf() {
|
|||
/* relocation table */
|
||||
s = ctxt.Syms.Lookup(elfRelType, 0)
|
||||
s.Attr |= AttrReachable
|
||||
s.Type = objabi.SELFROSECT
|
||||
s.Type = SELFROSECT
|
||||
|
||||
/* global offset table */
|
||||
s = ctxt.Syms.Lookup(".got", 0)
|
||||
|
||||
s.Attr |= AttrReachable
|
||||
s.Type = objabi.SELFGOT // writable
|
||||
s.Type = SELFGOT // writable
|
||||
|
||||
/* ppc64 glink resolver */
|
||||
if SysArch.Family == sys.PPC64 {
|
||||
s := ctxt.Syms.Lookup(".glink", 0)
|
||||
s.Attr |= AttrReachable
|
||||
s.Type = objabi.SELFRXSECT
|
||||
s.Type = SELFRXSECT
|
||||
}
|
||||
|
||||
/* hash */
|
||||
s = ctxt.Syms.Lookup(".hash", 0)
|
||||
|
||||
s.Attr |= AttrReachable
|
||||
s.Type = objabi.SELFROSECT
|
||||
s.Type = SELFROSECT
|
||||
|
||||
s = ctxt.Syms.Lookup(".got.plt", 0)
|
||||
s.Attr |= AttrReachable
|
||||
s.Type = objabi.SELFSECT // writable
|
||||
s.Type = SELFSECT // writable
|
||||
|
||||
s = ctxt.Syms.Lookup(".plt", 0)
|
||||
|
||||
|
@ -2044,30 +2044,30 @@ func (ctxt *Link) doelf() {
|
|||
if SysArch.Family == sys.PPC64 {
|
||||
// In the ppc64 ABI, .plt is a data section
|
||||
// written by the dynamic linker.
|
||||
s.Type = objabi.SELFSECT
|
||||
s.Type = SELFSECT
|
||||
} else {
|
||||
s.Type = objabi.SELFRXSECT
|
||||
s.Type = SELFRXSECT
|
||||
}
|
||||
|
||||
Thearch.Elfsetupplt(ctxt)
|
||||
|
||||
s = ctxt.Syms.Lookup(elfRelType+".plt", 0)
|
||||
s.Attr |= AttrReachable
|
||||
s.Type = objabi.SELFROSECT
|
||||
s.Type = SELFROSECT
|
||||
|
||||
s = ctxt.Syms.Lookup(".gnu.version", 0)
|
||||
s.Attr |= AttrReachable
|
||||
s.Type = objabi.SELFROSECT
|
||||
s.Type = SELFROSECT
|
||||
|
||||
s = ctxt.Syms.Lookup(".gnu.version_r", 0)
|
||||
s.Attr |= AttrReachable
|
||||
s.Type = objabi.SELFROSECT
|
||||
s.Type = SELFROSECT
|
||||
|
||||
/* define dynamic elf table */
|
||||
s = ctxt.Syms.Lookup(".dynamic", 0)
|
||||
|
||||
s.Attr |= AttrReachable
|
||||
s.Type = objabi.SELFSECT // writable
|
||||
s.Type = SELFSECT // writable
|
||||
|
||||
/*
|
||||
* .dynamic table
|
||||
|
@ -2120,7 +2120,7 @@ func (ctxt *Link) doelf() {
|
|||
// part of the .note.go.abihash section in data.go:func address().
|
||||
s := ctxt.Syms.Lookup("go.link.abihashbytes", 0)
|
||||
s.Attr |= AttrLocal
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Attr |= AttrSpecial
|
||||
s.Attr |= AttrReachable
|
||||
s.Size = int64(sha1.Size)
|
||||
|
@ -2596,10 +2596,10 @@ elfobj:
|
|||
elfshreloc(sect)
|
||||
}
|
||||
for _, s := range dwarfp {
|
||||
if len(s.R) > 0 || s.Type == objabi.SDWARFINFO {
|
||||
if len(s.R) > 0 || s.Type == SDWARFINFO {
|
||||
elfshreloc(s.Sect)
|
||||
}
|
||||
if s.Type == objabi.SDWARFINFO {
|
||||
if s.Type == SDWARFINFO {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
@ -2715,7 +2715,7 @@ func Elfadddynsym(ctxt *Link, s *Symbol) {
|
|||
/* type */
|
||||
t := STB_GLOBAL << 4
|
||||
|
||||
if s.Attr.CgoExport() && s.Type&objabi.SMASK == objabi.STEXT {
|
||||
if s.Attr.CgoExport() && s.Type&SMASK == STEXT {
|
||||
t |= STT_FUNC
|
||||
} else {
|
||||
t |= STT_OBJECT
|
||||
|
@ -2726,14 +2726,14 @@ func Elfadddynsym(ctxt *Link, s *Symbol) {
|
|||
Adduint8(ctxt, d, 0)
|
||||
|
||||
/* section where symbol is defined */
|
||||
if s.Type == objabi.SDYNIMPORT {
|
||||
if s.Type == SDYNIMPORT {
|
||||
Adduint16(ctxt, d, SHN_UNDEF)
|
||||
} else {
|
||||
Adduint16(ctxt, d, 1)
|
||||
}
|
||||
|
||||
/* value */
|
||||
if s.Type == objabi.SDYNIMPORT {
|
||||
if s.Type == SDYNIMPORT {
|
||||
Adduint64(ctxt, d, 0)
|
||||
} else {
|
||||
Addaddr(ctxt, d, s)
|
||||
|
@ -2757,7 +2757,7 @@ func Elfadddynsym(ctxt *Link, s *Symbol) {
|
|||
Adduint32(ctxt, d, uint32(Addstring(ctxt.Syms.Lookup(".dynstr", 0), name)))
|
||||
|
||||
/* value */
|
||||
if s.Type == objabi.SDYNIMPORT {
|
||||
if s.Type == SDYNIMPORT {
|
||||
Adduint32(ctxt, d, 0)
|
||||
} else {
|
||||
Addaddr(ctxt, d, s)
|
||||
|
@ -2770,9 +2770,9 @@ func Elfadddynsym(ctxt *Link, s *Symbol) {
|
|||
t := STB_GLOBAL << 4
|
||||
|
||||
// TODO(mwhudson): presumably the behavior should actually be the same on both arm and 386.
|
||||
if SysArch.Family == sys.I386 && s.Attr.CgoExport() && s.Type&objabi.SMASK == objabi.STEXT {
|
||||
if SysArch.Family == sys.I386 && s.Attr.CgoExport() && s.Type&SMASK == STEXT {
|
||||
t |= STT_FUNC
|
||||
} else if SysArch.Family == sys.ARM && s.Attr.CgoExportDynamic() && s.Type&objabi.SMASK == objabi.STEXT {
|
||||
} else if SysArch.Family == sys.ARM && s.Attr.CgoExportDynamic() && s.Type&SMASK == STEXT {
|
||||
t |= STT_FUNC
|
||||
} else {
|
||||
t |= STT_OBJECT
|
||||
|
@ -2781,7 +2781,7 @@ func Elfadddynsym(ctxt *Link, s *Symbol) {
|
|||
Adduint8(ctxt, d, 0)
|
||||
|
||||
/* shndx */
|
||||
if s.Type == objabi.SDYNIMPORT {
|
||||
if s.Type == SDYNIMPORT {
|
||||
Adduint16(ctxt, d, SHN_UNDEF)
|
||||
} else {
|
||||
Adduint16(ctxt, d, 1)
|
||||
|
|
|
@ -190,12 +190,12 @@ func loadcgo(ctxt *Link, file string, pkg string, p string) {
|
|||
s = ctxt.Syms.Lookup(local, 0)
|
||||
if local != f[1] {
|
||||
}
|
||||
if s.Type == 0 || s.Type == objabi.SXREF || s.Type == objabi.SHOSTOBJ {
|
||||
if s.Type == 0 || s.Type == SXREF || s.Type == SHOSTOBJ {
|
||||
s.Dynimplib = lib
|
||||
s.Extname = remote
|
||||
s.Dynimpvers = q
|
||||
if s.Type != objabi.SHOSTOBJ {
|
||||
s.Type = objabi.SDYNIMPORT
|
||||
if s.Type != SHOSTOBJ {
|
||||
s.Type = SDYNIMPORT
|
||||
}
|
||||
havedynamic = 1
|
||||
}
|
||||
|
@ -209,7 +209,7 @@ func loadcgo(ctxt *Link, file string, pkg string, p string) {
|
|||
}
|
||||
local = f[1]
|
||||
s = ctxt.Syms.Lookup(local, 0)
|
||||
s.Type = objabi.SHOSTOBJ
|
||||
s.Type = SHOSTOBJ
|
||||
s.Size = 0
|
||||
continue
|
||||
}
|
||||
|
@ -347,7 +347,7 @@ func fieldtrack(ctxt *Link) {
|
|||
buf.WriteString("\n")
|
||||
}
|
||||
|
||||
s.Type = objabi.SCONST
|
||||
s.Type = SCONST
|
||||
s.Value = 0
|
||||
}
|
||||
}
|
||||
|
|
|
@ -729,21 +729,21 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||
return
|
||||
|
||||
case ElfSectFlagAlloc:
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
|
||||
case ElfSectFlagAlloc + ElfSectFlagWrite:
|
||||
if sect.type_ == ElfSectNobits {
|
||||
s.Type = objabi.SNOPTRBSS
|
||||
s.Type = SNOPTRBSS
|
||||
} else {
|
||||
s.Type = objabi.SNOPTRDATA
|
||||
s.Type = SNOPTRDATA
|
||||
}
|
||||
|
||||
case ElfSectFlagAlloc + ElfSectFlagExec:
|
||||
s.Type = objabi.STEXT
|
||||
s.Type = STEXT
|
||||
}
|
||||
|
||||
if sect.name == ".got" || sect.name == ".toc" {
|
||||
s.Type = objabi.SELFGOT
|
||||
s.Type = SELFGOT
|
||||
}
|
||||
if sect.type_ == ElfSectProgbits {
|
||||
s.P = sect.base
|
||||
|
@ -773,8 +773,8 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||
if uint64(s.Size) < sym.size {
|
||||
s.Size = int64(sym.size)
|
||||
}
|
||||
if s.Type == 0 || s.Type == objabi.SXREF {
|
||||
s.Type = objabi.SNOPTRBSS
|
||||
if s.Type == 0 || s.Type == SXREF {
|
||||
s.Type = SNOPTRBSS
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
@ -816,14 +816,14 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||
|
||||
s.Sub = sect.sym.Sub
|
||||
sect.sym.Sub = s
|
||||
s.Type = sect.sym.Type | s.Type&^objabi.SMASK | objabi.SSUB
|
||||
s.Type = sect.sym.Type | s.Type&^SMASK | SSUB
|
||||
if !s.Attr.CgoExportDynamic() {
|
||||
s.Dynimplib = "" // satisfy dynimport
|
||||
}
|
||||
s.Value = int64(sym.value)
|
||||
s.Size = int64(sym.size)
|
||||
s.Outer = sect.sym
|
||||
if sect.sym.Type == objabi.STEXT {
|
||||
if sect.sym.Type == STEXT {
|
||||
if s.Attr.External() && !s.Attr.DuplicateOK() {
|
||||
Errorf(s, "%s: duplicate symbol definition", pn)
|
||||
}
|
||||
|
@ -850,7 +850,7 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||
if s.Sub != nil {
|
||||
s.Sub = listsort(s.Sub)
|
||||
}
|
||||
if s.Type == objabi.STEXT {
|
||||
if s.Type == STEXT {
|
||||
if s.Attr.OnList() {
|
||||
log.Fatalf("symbol %s listed multiple times", s.Name)
|
||||
}
|
||||
|
@ -1060,7 +1060,7 @@ func readelfsym(ctxt *Link, elfobj *ElfObj, i int, sym *ElfSym, needSym int, loc
|
|||
// set dupok generally. See http://codereview.appspot.com/5823055/
|
||||
// comment #5 for details.
|
||||
if s != nil && sym.other == 2 {
|
||||
s.Type |= objabi.SHIDDEN
|
||||
s.Type |= SHIDDEN
|
||||
s.Attr |= AttrDuplicateOK
|
||||
}
|
||||
}
|
||||
|
@ -1077,7 +1077,7 @@ func readelfsym(ctxt *Link, elfobj *ElfObj, i int, sym *ElfSym, needSym int, loc
|
|||
// so put it in the hash table.
|
||||
if needSym != 0 {
|
||||
s = ctxt.Syms.Lookup(sym.name, localSymVersion)
|
||||
s.Type |= objabi.SHIDDEN
|
||||
s.Type |= SHIDDEN
|
||||
}
|
||||
|
||||
break
|
||||
|
@ -1089,14 +1089,14 @@ func readelfsym(ctxt *Link, elfobj *ElfObj, i int, sym *ElfSym, needSym int, loc
|
|||
// don't bother to add them into the hash table
|
||||
s = ctxt.Syms.newsym(sym.name, localSymVersion)
|
||||
|
||||
s.Type |= objabi.SHIDDEN
|
||||
s.Type |= SHIDDEN
|
||||
}
|
||||
|
||||
case ElfSymBindWeak:
|
||||
if needSym != 0 {
|
||||
s = ctxt.Syms.Lookup(sym.name, 0)
|
||||
if sym.other == 2 {
|
||||
s.Type |= objabi.SHIDDEN
|
||||
s.Type |= SHIDDEN
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1107,7 +1107,7 @@ func readelfsym(ctxt *Link, elfobj *ElfObj, i int, sym *ElfSym, needSym int, loc
|
|||
}
|
||||
|
||||
if s != nil && s.Type == 0 && sym.type_ != ElfSymTypeSection {
|
||||
s.Type = objabi.SXREF
|
||||
s.Type = SXREF
|
||||
}
|
||||
sym.sym = s
|
||||
|
||||
|
|
|
@ -602,16 +602,16 @@ func ldmacho(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||
|
||||
if sect.segname == "__TEXT" {
|
||||
if sect.name == "__text" {
|
||||
s.Type = objabi.STEXT
|
||||
s.Type = STEXT
|
||||
} else {
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
}
|
||||
} else {
|
||||
if sect.name == "__bss" {
|
||||
s.Type = objabi.SNOPTRBSS
|
||||
s.Type = SNOPTRBSS
|
||||
s.P = s.P[:0]
|
||||
} else {
|
||||
s.Type = objabi.SNOPTRDATA
|
||||
s.Type = SNOPTRDATA
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -663,7 +663,7 @@ func ldmacho(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||
Exitf("%s: duplicate symbol reference: %s in both %s and %s", pn, s.Name, s.Outer.Name, sect.sym.Name)
|
||||
}
|
||||
|
||||
s.Type = outer.Type | objabi.SSUB
|
||||
s.Type = outer.Type | SSUB
|
||||
s.Sub = outer.Sub
|
||||
outer.Sub = s
|
||||
s.Outer = outer
|
||||
|
@ -671,7 +671,7 @@ func ldmacho(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||
if !s.Attr.CgoExportDynamic() {
|
||||
s.Dynimplib = "" // satisfy dynimport
|
||||
}
|
||||
if outer.Type == objabi.STEXT {
|
||||
if outer.Type == STEXT {
|
||||
if s.Attr.External() && !s.Attr.DuplicateOK() {
|
||||
Errorf(s, "%s: duplicate symbol definition", pn)
|
||||
}
|
||||
|
@ -702,7 +702,7 @@ func ldmacho(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||
}
|
||||
}
|
||||
|
||||
if s.Type == objabi.STEXT {
|
||||
if s.Type == STEXT {
|
||||
if s.Attr.OnList() {
|
||||
log.Fatalf("symbol %s listed multiple times", s.Name)
|
||||
}
|
||||
|
|
|
@ -173,16 +173,16 @@ func ldpeError(ctxt *Link, input *bio.Reader, pkg string, length int64, pn strin
|
|||
|
||||
switch sect.Characteristics & (IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE) {
|
||||
case IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ: //.rdata
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
|
||||
case IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE: //.bss
|
||||
s.Type = objabi.SNOPTRBSS
|
||||
s.Type = SNOPTRBSS
|
||||
|
||||
case IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE: //.data
|
||||
s.Type = objabi.SNOPTRDATA
|
||||
s.Type = SNOPTRDATA
|
||||
|
||||
case IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ: //.text
|
||||
s.Type = objabi.STEXT
|
||||
s.Type = STEXT
|
||||
|
||||
default:
|
||||
return fmt.Errorf("unexpected flags %#06x for PE section %s", sect.Characteristics, sect.Name)
|
||||
|
@ -313,11 +313,11 @@ func ldpeError(ctxt *Link, input *bio.Reader, pkg string, length int64, pn strin
|
|||
}
|
||||
|
||||
if pesym.SectionNumber == 0 { // extern
|
||||
if s.Type == objabi.SDYNIMPORT {
|
||||
if s.Type == SDYNIMPORT {
|
||||
s.Plt = -2 // flag for dynimport in PE object files.
|
||||
}
|
||||
if s.Type == objabi.SXREF && pesym.Value > 0 { // global data
|
||||
s.Type = objabi.SNOPTRDATA
|
||||
if s.Type == SXREF && pesym.Value > 0 { // global data
|
||||
s.Type = SNOPTRDATA
|
||||
s.Size = int64(pesym.Value)
|
||||
}
|
||||
|
||||
|
@ -345,11 +345,11 @@ func ldpeError(ctxt *Link, input *bio.Reader, pkg string, length int64, pn strin
|
|||
sectsym := sectsyms[sect]
|
||||
s.Sub = sectsym.Sub
|
||||
sectsym.Sub = s
|
||||
s.Type = sectsym.Type | objabi.SSUB
|
||||
s.Type = sectsym.Type | SSUB
|
||||
s.Value = int64(pesym.Value)
|
||||
s.Size = 4
|
||||
s.Outer = sectsym
|
||||
if sectsym.Type == objabi.STEXT {
|
||||
if sectsym.Type == STEXT {
|
||||
if s.Attr.External() && !s.Attr.DuplicateOK() {
|
||||
Errorf(s, "%s: duplicate symbol definition", pn)
|
||||
}
|
||||
|
@ -367,7 +367,7 @@ func ldpeError(ctxt *Link, input *bio.Reader, pkg string, length int64, pn strin
|
|||
if s.Sub != nil {
|
||||
s.Sub = listsort(s.Sub)
|
||||
}
|
||||
if s.Type == objabi.STEXT {
|
||||
if s.Type == STEXT {
|
||||
if s.Attr.OnList() {
|
||||
log.Fatalf("symbol %s listed multiple times", s.Name)
|
||||
}
|
||||
|
@ -433,7 +433,7 @@ func readpesym(ctxt *Link, f *pe.File, sym *pe.COFFSymbol, sectsyms map[*pe.Sect
|
|||
}
|
||||
|
||||
if s != nil && s.Type == 0 && (sym.StorageClass != IMAGE_SYM_CLASS_STATIC || sym.Value != 0) {
|
||||
s.Type = objabi.SXREF
|
||||
s.Type = SXREF
|
||||
}
|
||||
if strings.HasPrefix(symname, "__imp_") {
|
||||
s.Got = -2 // flag for __imp_
|
||||
|
|
|
@ -440,7 +440,7 @@ func (ctxt *Link) loadlib() {
|
|||
|
||||
if Linkmode == LinkExternal && SysArch.Family == sys.PPC64 {
|
||||
toc := ctxt.Syms.Lookup(".TOC.", 0)
|
||||
toc.Type = objabi.SDYNIMPORT
|
||||
toc.Type = SDYNIMPORT
|
||||
}
|
||||
|
||||
if Linkmode == LinkExternal && !iscgo {
|
||||
|
@ -466,13 +466,13 @@ func (ctxt *Link) loadlib() {
|
|||
// Drop all the cgo_import_static declarations.
|
||||
// Turns out we won't be needing them.
|
||||
for _, s := range ctxt.Syms.Allsym {
|
||||
if s.Type == objabi.SHOSTOBJ {
|
||||
if s.Type == SHOSTOBJ {
|
||||
// If a symbol was marked both
|
||||
// cgo_import_static and cgo_import_dynamic,
|
||||
// then we want to make it cgo_import_dynamic
|
||||
// now.
|
||||
if s.Extname != "" && s.Dynimplib != "" && !s.Attr.CgoExport() {
|
||||
s.Type = objabi.SDYNIMPORT
|
||||
s.Type = SDYNIMPORT
|
||||
} else {
|
||||
s.Type = 0
|
||||
}
|
||||
|
@ -485,9 +485,9 @@ func (ctxt *Link) loadlib() {
|
|||
// runtime.tlsg is used for external linking on platforms that do not define
|
||||
// a variable to hold g in assembly (currently only intel).
|
||||
if tlsg.Type == 0 {
|
||||
tlsg.Type = objabi.STLSBSS
|
||||
tlsg.Type = STLSBSS
|
||||
tlsg.Size = int64(SysArch.PtrSize)
|
||||
} else if tlsg.Type != objabi.SDYNIMPORT {
|
||||
} else if tlsg.Type != SDYNIMPORT {
|
||||
Errorf(nil, "runtime declared tlsg variable %v", tlsg.Type)
|
||||
}
|
||||
tlsg.Attr |= AttrReachable
|
||||
|
@ -500,7 +500,7 @@ func (ctxt *Link) loadlib() {
|
|||
} else {
|
||||
moduledata = ctxt.Syms.Lookup("runtime.firstmoduledata", 0)
|
||||
}
|
||||
if moduledata.Type != 0 && moduledata.Type != objabi.SDYNIMPORT {
|
||||
if moduledata.Type != 0 && moduledata.Type != SDYNIMPORT {
|
||||
// If the module (toolchain-speak for "executable or shared
|
||||
// library") we are linking contains the runtime package, it
|
||||
// will define the runtime.firstmoduledata symbol and we
|
||||
|
@ -512,14 +512,14 @@ func (ctxt *Link) loadlib() {
|
|||
// recording the value of GOARM.
|
||||
if SysArch.Family == sys.ARM {
|
||||
s := ctxt.Syms.Lookup("runtime.goarm", 0)
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Size = 0
|
||||
Adduint8(ctxt, s, uint8(objabi.GOARM))
|
||||
}
|
||||
|
||||
if objabi.Framepointer_enabled(objabi.GOOS, objabi.GOARCH) {
|
||||
s := ctxt.Syms.Lookup("runtime.framepointer_enabled", 0)
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Size = 0
|
||||
Adduint8(ctxt, s, 1)
|
||||
}
|
||||
|
@ -531,7 +531,7 @@ func (ctxt *Link) loadlib() {
|
|||
}
|
||||
// In all cases way we mark the moduledata as noptrdata to hide it from
|
||||
// the GC.
|
||||
moduledata.Type = objabi.SNOPTRDATA
|
||||
moduledata.Type = SNOPTRDATA
|
||||
moduledata.Attr |= AttrReachable
|
||||
ctxt.Moduledata = moduledata
|
||||
|
||||
|
@ -559,7 +559,7 @@ func (ctxt *Link) loadlib() {
|
|||
any := false
|
||||
for _, s := range ctxt.Syms.Allsym {
|
||||
for _, r := range s.R {
|
||||
if r.Sym != nil && r.Sym.Type&objabi.SMASK == objabi.SXREF && r.Sym.Name != ".got" {
|
||||
if r.Sym != nil && r.Sym.Type&SMASK == SXREF && r.Sym.Name != ".got" {
|
||||
any = true
|
||||
break
|
||||
}
|
||||
|
@ -625,7 +625,7 @@ func (ctxt *Link) loadlib() {
|
|||
if SysArch == sys.Arch386 {
|
||||
if (Buildmode == BuildmodeCArchive && Iself) || Buildmode == BuildmodeCShared || Buildmode == BuildmodePIE || ctxt.DynlinkingGo() {
|
||||
got := ctxt.Syms.Lookup("_GLOBAL_OFFSET_TABLE_", 0)
|
||||
got.Type = objabi.SDYNIMPORT
|
||||
got.Type = SDYNIMPORT
|
||||
got.Attr |= AttrReachable
|
||||
}
|
||||
}
|
||||
|
@ -663,7 +663,7 @@ func (ctxt *Link) loadlib() {
|
|||
// pcln table entries for these any more so remove them from Textp.
|
||||
textp := make([]*Symbol, 0, len(ctxt.Textp))
|
||||
for _, s := range ctxt.Textp {
|
||||
if s.Type != objabi.SDYNIMPORT {
|
||||
if s.Type != SDYNIMPORT {
|
||||
textp = append(textp, s)
|
||||
}
|
||||
}
|
||||
|
@ -1526,10 +1526,10 @@ func ldshlibsyms(ctxt *Link, shlib string) {
|
|||
// libraries, any non-dynimport symbols we find that duplicate symbols
|
||||
// already loaded should be ignored (the symbols from the .a files
|
||||
// "win").
|
||||
if lsym.Type != 0 && lsym.Type != objabi.SDYNIMPORT {
|
||||
if lsym.Type != 0 && lsym.Type != SDYNIMPORT {
|
||||
continue
|
||||
}
|
||||
lsym.Type = objabi.SDYNIMPORT
|
||||
lsym.Type = SDYNIMPORT
|
||||
lsym.ElfType = elf.ST_TYPE(elfsym.Info)
|
||||
lsym.Size = int64(elfsym.Size)
|
||||
if elfsym.Section != elf.SHN_UNDEF {
|
||||
|
@ -1689,7 +1689,7 @@ func stkcheck(ctxt *Link, up *chain, depth int) int {
|
|||
// should never be called directly.
|
||||
// onlyctxt.Diagnose the direct caller.
|
||||
// TODO(mwhudson): actually think about this.
|
||||
if depth == 1 && s.Type != objabi.SXREF && !ctxt.DynlinkingGo() &&
|
||||
if depth == 1 && s.Type != SXREF && !ctxt.DynlinkingGo() &&
|
||||
Buildmode != BuildmodeCArchive && Buildmode != BuildmodePIE && Buildmode != BuildmodeCShared && Buildmode != BuildmodePlugin {
|
||||
|
||||
Errorf(s, "call to external function")
|
||||
|
@ -1872,7 +1872,7 @@ func genasmsym(ctxt *Link, put func(*Link, *Symbol, string, SymbolType, int64, *
|
|||
// These symbols won't show up in the first loop below because we
|
||||
// skip STEXT symbols. Normal STEXT symbols are emitted by walking textp.
|
||||
s := ctxt.Syms.Lookup("runtime.text", 0)
|
||||
if s.Type == objabi.STEXT {
|
||||
if s.Type == STEXT {
|
||||
put(ctxt, s, s.Name, TextSym, s.Value, nil)
|
||||
}
|
||||
|
||||
|
@ -1891,14 +1891,14 @@ func genasmsym(ctxt *Link, put func(*Link, *Symbol, string, SymbolType, int64, *
|
|||
if s == nil {
|
||||
break
|
||||
}
|
||||
if s.Type == objabi.STEXT {
|
||||
if s.Type == STEXT {
|
||||
put(ctxt, s, s.Name, TextSym, s.Value, nil)
|
||||
}
|
||||
n++
|
||||
}
|
||||
|
||||
s = ctxt.Syms.Lookup("runtime.etext", 0)
|
||||
if s.Type == objabi.STEXT {
|
||||
if s.Type == STEXT {
|
||||
put(ctxt, s, s.Name, TextSym, s.Value, nil)
|
||||
}
|
||||
|
||||
|
@ -1909,36 +1909,36 @@ func genasmsym(ctxt *Link, put func(*Link, *Symbol, string, SymbolType, int64, *
|
|||
if (s.Name == "" || s.Name[0] == '.') && s.Version == 0 && s.Name != ".rathole" && s.Name != ".TOC." {
|
||||
continue
|
||||
}
|
||||
switch s.Type & objabi.SMASK {
|
||||
case objabi.SCONST,
|
||||
objabi.SRODATA,
|
||||
objabi.SSYMTAB,
|
||||
objabi.SPCLNTAB,
|
||||
objabi.SINITARR,
|
||||
objabi.SDATA,
|
||||
objabi.SNOPTRDATA,
|
||||
objabi.SELFROSECT,
|
||||
objabi.SMACHOGOT,
|
||||
objabi.STYPE,
|
||||
objabi.SSTRING,
|
||||
objabi.SGOSTRING,
|
||||
objabi.SGOFUNC,
|
||||
objabi.SGCBITS,
|
||||
objabi.STYPERELRO,
|
||||
objabi.SSTRINGRELRO,
|
||||
objabi.SGOSTRINGRELRO,
|
||||
objabi.SGOFUNCRELRO,
|
||||
objabi.SGCBITSRELRO,
|
||||
objabi.SRODATARELRO,
|
||||
objabi.STYPELINK,
|
||||
objabi.SITABLINK,
|
||||
objabi.SWINDOWS:
|
||||
switch s.Type & SMASK {
|
||||
case SCONST,
|
||||
SRODATA,
|
||||
SSYMTAB,
|
||||
SPCLNTAB,
|
||||
SINITARR,
|
||||
SDATA,
|
||||
SNOPTRDATA,
|
||||
SELFROSECT,
|
||||
SMACHOGOT,
|
||||
STYPE,
|
||||
SSTRING,
|
||||
SGOSTRING,
|
||||
SGOFUNC,
|
||||
SGCBITS,
|
||||
STYPERELRO,
|
||||
SSTRINGRELRO,
|
||||
SGOSTRINGRELRO,
|
||||
SGOFUNCRELRO,
|
||||
SGCBITSRELRO,
|
||||
SRODATARELRO,
|
||||
STYPELINK,
|
||||
SITABLINK,
|
||||
SWINDOWS:
|
||||
if !s.Attr.Reachable() {
|
||||
continue
|
||||
}
|
||||
put(ctxt, s, s.Name, DataSym, Symaddr(s), s.Gotype)
|
||||
|
||||
case objabi.SBSS, objabi.SNOPTRBSS:
|
||||
case SBSS, SNOPTRBSS:
|
||||
if !s.Attr.Reachable() {
|
||||
continue
|
||||
}
|
||||
|
@ -1947,21 +1947,21 @@ func genasmsym(ctxt *Link, put func(*Link, *Symbol, string, SymbolType, int64, *
|
|||
}
|
||||
put(ctxt, s, s.Name, BSSSym, Symaddr(s), s.Gotype)
|
||||
|
||||
case objabi.SFILE:
|
||||
case SFILE:
|
||||
put(ctxt, nil, s.Name, FileSym, s.Value, nil)
|
||||
|
||||
case objabi.SHOSTOBJ:
|
||||
case SHOSTOBJ:
|
||||
if Headtype == objabi.Hwindows || Iself {
|
||||
put(ctxt, s, s.Name, UndefinedSym, s.Value, nil)
|
||||
}
|
||||
|
||||
case objabi.SDYNIMPORT:
|
||||
case SDYNIMPORT:
|
||||
if !s.Attr.Reachable() {
|
||||
continue
|
||||
}
|
||||
put(ctxt, s, s.Extname, UndefinedSym, 0, nil)
|
||||
|
||||
case objabi.STLSBSS:
|
||||
case STLSBSS:
|
||||
if Linkmode == LinkExternal {
|
||||
put(ctxt, s, s.Name, TLSSym, Symaddr(s), s.Gotype)
|
||||
}
|
||||
|
@ -2024,7 +2024,7 @@ func Symaddr(s *Symbol) int64 {
|
|||
return s.Value
|
||||
}
|
||||
|
||||
func (ctxt *Link) xdefine(p string, t objabi.SymKind, v int64) {
|
||||
func (ctxt *Link) xdefine(p string, t SymKind, v int64) {
|
||||
s := ctxt.Syms.Lookup(p, 0)
|
||||
s.Type = t
|
||||
s.Value = v
|
||||
|
@ -2053,7 +2053,7 @@ func Entryvalue(ctxt *Link) int64 {
|
|||
if s.Type == 0 {
|
||||
return *FlagTextAddr
|
||||
}
|
||||
if s.Type != objabi.STEXT {
|
||||
if s.Type != STEXT {
|
||||
Errorf(s, "entry not text")
|
||||
}
|
||||
return s.Value
|
||||
|
@ -2067,7 +2067,7 @@ func undefsym(ctxt *Link, s *Symbol) {
|
|||
if r.Sym == nil { // happens for some external ARM relocs
|
||||
continue
|
||||
}
|
||||
if r.Sym.Type == objabi.Sxxx || r.Sym.Type == objabi.SXREF {
|
||||
if r.Sym.Type == Sxxx || r.Sym.Type == SXREF {
|
||||
Errorf(s, "undefined: %q", r.Sym.Name)
|
||||
}
|
||||
if !r.Sym.Attr.Reachable() && r.Type != objabi.R_WEAKADDROFF {
|
||||
|
@ -2101,7 +2101,7 @@ func (ctxt *Link) callgraph() {
|
|||
if r.Sym == nil {
|
||||
continue
|
||||
}
|
||||
if (r.Type == objabi.R_CALL || r.Type == objabi.R_CALLARM || r.Type == objabi.R_CALLPOWER || r.Type == objabi.R_CALLMIPS) && r.Sym.Type == objabi.STEXT {
|
||||
if (r.Type == objabi.R_CALL || r.Type == objabi.R_CALLARM || r.Type == objabi.R_CALLPOWER || r.Type == objabi.R_CALLMIPS) && r.Sym.Type == STEXT {
|
||||
ctxt.Logf("%s calls %s\n", s.Name, r.Sym.Name)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ import (
|
|||
type Symbol struct {
|
||||
Name string
|
||||
Extname string
|
||||
Type objabi.SymKind
|
||||
Type SymKind
|
||||
Version int16
|
||||
Attr Attribute
|
||||
Localentry uint8
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
package ld
|
||||
|
||||
import (
|
||||
"cmd/internal/objabi"
|
||||
"cmd/internal/sys"
|
||||
"sort"
|
||||
"strings"
|
||||
|
@ -302,31 +301,31 @@ func (ctxt *Link) domacho() {
|
|||
// empirically, string table must begin with " \x00".
|
||||
s := ctxt.Syms.Lookup(".machosymstr", 0)
|
||||
|
||||
s.Type = objabi.SMACHOSYMSTR
|
||||
s.Type = SMACHOSYMSTR
|
||||
s.Attr |= AttrReachable
|
||||
Adduint8(ctxt, s, ' ')
|
||||
Adduint8(ctxt, s, '\x00')
|
||||
|
||||
s = ctxt.Syms.Lookup(".machosymtab", 0)
|
||||
s.Type = objabi.SMACHOSYMTAB
|
||||
s.Type = SMACHOSYMTAB
|
||||
s.Attr |= AttrReachable
|
||||
|
||||
if Linkmode != LinkExternal {
|
||||
s := ctxt.Syms.Lookup(".plt", 0) // will be __symbol_stub
|
||||
s.Type = objabi.SMACHOPLT
|
||||
s.Type = SMACHOPLT
|
||||
s.Attr |= AttrReachable
|
||||
|
||||
s = ctxt.Syms.Lookup(".got", 0) // will be __nl_symbol_ptr
|
||||
s.Type = objabi.SMACHOGOT
|
||||
s.Type = SMACHOGOT
|
||||
s.Attr |= AttrReachable
|
||||
s.Align = 4
|
||||
|
||||
s = ctxt.Syms.Lookup(".linkedit.plt", 0) // indirect table for .plt
|
||||
s.Type = objabi.SMACHOINDIRECTPLT
|
||||
s.Type = SMACHOINDIRECTPLT
|
||||
s.Attr |= AttrReachable
|
||||
|
||||
s = ctxt.Syms.Lookup(".linkedit.got", 0) // indirect table for .got
|
||||
s.Type = objabi.SMACHOINDIRECTGOT
|
||||
s.Type = SMACHOINDIRECTGOT
|
||||
s.Attr |= AttrReachable
|
||||
}
|
||||
}
|
||||
|
@ -603,7 +602,7 @@ func Asmbmacho(ctxt *Link) {
|
|||
}
|
||||
|
||||
func symkind(s *Symbol) int {
|
||||
if s.Type == objabi.SDYNIMPORT {
|
||||
if s.Type == SDYNIMPORT {
|
||||
return SymKindUndef
|
||||
}
|
||||
if s.Attr.CgoExport() {
|
||||
|
@ -659,7 +658,7 @@ func (x machoscmp) Less(i, j int) bool {
|
|||
func machogenasmsym(ctxt *Link) {
|
||||
genasmsym(ctxt, addsym)
|
||||
for _, s := range ctxt.Syms.Allsym {
|
||||
if s.Type == objabi.SDYNIMPORT || s.Type == objabi.SHOSTOBJ {
|
||||
if s.Type == SDYNIMPORT || s.Type == SHOSTOBJ {
|
||||
if s.Attr.Reachable() {
|
||||
addsym(ctxt, s, "", DataSym, 0, nil)
|
||||
}
|
||||
|
@ -704,7 +703,7 @@ func machoShouldExport(ctxt *Link, s *Symbol) bool {
|
|||
if strings.HasPrefix(s.Name, "go.link.pkghash") {
|
||||
return true
|
||||
}
|
||||
return s.Type >= objabi.SELFSECT // only writable sections
|
||||
return s.Type >= SELFSECT // only writable sections
|
||||
}
|
||||
|
||||
func machosymtab(ctxt *Link) {
|
||||
|
@ -732,7 +731,7 @@ func machosymtab(ctxt *Link) {
|
|||
// replace "·" as ".", because DTrace cannot handle it.
|
||||
Addstring(symstr, strings.Replace(s.Extname, "·", ".", -1))
|
||||
|
||||
if s.Type == objabi.SDYNIMPORT || s.Type == objabi.SHOSTOBJ {
|
||||
if s.Type == SDYNIMPORT || s.Type == SHOSTOBJ {
|
||||
Adduint8(ctxt, symtab, 0x01) // type N_EXT, external symbol
|
||||
Adduint8(ctxt, symtab, 0) // no section
|
||||
Adduint16(ctxt, symtab, 0) // desc
|
||||
|
|
|
@ -158,7 +158,7 @@ func (r *objReader) readSym() {
|
|||
if c, err := r.rd.ReadByte(); c != symPrefix || err != nil {
|
||||
log.Fatalln("readSym out of sync")
|
||||
}
|
||||
t := objabi.SymKind(r.readInt())
|
||||
t := abiSymKindToSymKind[r.readInt()]
|
||||
s := r.readSymIndex()
|
||||
flags := r.readInt()
|
||||
dupok := flags&1 != 0
|
||||
|
@ -172,8 +172,8 @@ func (r *objReader) readSym() {
|
|||
isdup := false
|
||||
|
||||
var dup *Symbol
|
||||
if s.Type != 0 && s.Type != objabi.SXREF {
|
||||
if (t == objabi.SDATA || t == objabi.SBSS || t == objabi.SNOPTRBSS) && len(data) == 0 && nreloc == 0 {
|
||||
if s.Type != 0 && s.Type != SXREF {
|
||||
if (t == SDATA || t == SBSS || t == SNOPTRBSS) && len(data) == 0 && nreloc == 0 {
|
||||
if s.Size < int64(size) {
|
||||
s.Size = int64(size)
|
||||
}
|
||||
|
@ -183,10 +183,10 @@ func (r *objReader) readSym() {
|
|||
return
|
||||
}
|
||||
|
||||
if (s.Type == objabi.SDATA || s.Type == objabi.SBSS || s.Type == objabi.SNOPTRBSS) && len(s.P) == 0 && len(s.R) == 0 {
|
||||
if (s.Type == SDATA || s.Type == SBSS || s.Type == SNOPTRBSS) && len(s.P) == 0 && len(s.R) == 0 {
|
||||
goto overwrite
|
||||
}
|
||||
if s.Type != objabi.SBSS && s.Type != objabi.SNOPTRBSS && !dupok && !s.Attr.DuplicateOK() {
|
||||
if s.Type != SBSS && s.Type != SNOPTRBSS && !dupok && !s.Attr.DuplicateOK() {
|
||||
log.Fatalf("duplicate symbol %s (types %d and %d) in %s and %s", s.Name, s.Type, t, s.File, r.pn)
|
||||
}
|
||||
if len(s.P) > 0 {
|
||||
|
@ -201,13 +201,13 @@ overwrite:
|
|||
if dupok {
|
||||
s.Attr |= AttrDuplicateOK
|
||||
}
|
||||
if t == objabi.SXREF {
|
||||
if t == SXREF {
|
||||
log.Fatalf("bad sxref")
|
||||
}
|
||||
if t == 0 {
|
||||
log.Fatalf("missing type for %s in %s", s.Name, r.pn)
|
||||
}
|
||||
if t == objabi.SBSS && (s.Type == objabi.SRODATA || s.Type == objabi.SNOPTRBSS) {
|
||||
if t == SBSS && (s.Type == SRODATA || s.Type == SNOPTRBSS) {
|
||||
t = s.Type
|
||||
}
|
||||
s.Type = t
|
||||
|
@ -240,7 +240,7 @@ overwrite:
|
|||
}
|
||||
}
|
||||
|
||||
if s.Type == objabi.STEXT {
|
||||
if s.Type == STEXT {
|
||||
s.FuncInfo = new(FuncInfo)
|
||||
pc := s.FuncInfo
|
||||
|
||||
|
@ -326,7 +326,7 @@ overwrite:
|
|||
}
|
||||
}
|
||||
}
|
||||
if s.Type == objabi.SDWARFINFO {
|
||||
if s.Type == SDWARFINFO {
|
||||
r.patchDWARFName(s)
|
||||
}
|
||||
}
|
||||
|
@ -389,7 +389,7 @@ func (r *objReader) readRef() {
|
|||
if err != nil {
|
||||
log.Panicf("failed to parse $-symbol %s: %v", s.Name, err)
|
||||
}
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Attr |= AttrLocal
|
||||
switch s.Name[:5] {
|
||||
case "$f32.":
|
||||
|
|
|
@ -111,10 +111,10 @@ func ftabaddstring(ctxt *Link, ftab *Symbol, s string) int32 {
|
|||
|
||||
// numberfile assigns a file number to the file if it hasn't been assigned already.
|
||||
func numberfile(ctxt *Link, file *Symbol) {
|
||||
if file.Type != objabi.SFILEPATH {
|
||||
if file.Type != SFILEPATH {
|
||||
ctxt.Filesyms = append(ctxt.Filesyms, file)
|
||||
file.Value = int64(len(ctxt.Filesyms))
|
||||
file.Type = objabi.SFILEPATH
|
||||
file.Type = SFILEPATH
|
||||
path := file.Name[len(src.FileSymPrefix):]
|
||||
file.Name = expandGoroot(path)
|
||||
}
|
||||
|
@ -180,7 +180,7 @@ func container(s *Symbol) int {
|
|||
}
|
||||
// We want to generate func table entries only for the "lowest level" symbols,
|
||||
// not containers of subsymbols.
|
||||
if s.Type&objabi.SCONTAINER != 0 {
|
||||
if s.Type&SCONTAINER != 0 {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
|
@ -201,7 +201,7 @@ var pclntabLastFunc *Symbol
|
|||
func (ctxt *Link) pclntab() {
|
||||
funcdataBytes := int64(0)
|
||||
ftab := ctxt.Syms.Lookup("runtime.pclntab", 0)
|
||||
ftab.Type = objabi.SPCLNTAB
|
||||
ftab.Type = SPCLNTAB
|
||||
ftab.Attr |= AttrReachable
|
||||
|
||||
// See golang.org/s/go12symtab for the format. Briefly:
|
||||
|
@ -215,7 +215,7 @@ func (ctxt *Link) pclntab() {
|
|||
// Find container symbols, mark them with SCONTAINER
|
||||
for _, s := range ctxt.Textp {
|
||||
if s.Outer != nil {
|
||||
s.Outer.Type |= objabi.SCONTAINER
|
||||
s.Outer.Type |= SCONTAINER
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -334,7 +334,7 @@ func (ctxt *Link) pclntab() {
|
|||
|
||||
if len(pcln.InlTree) > 0 {
|
||||
inlTreeSym := ctxt.Syms.Lookup("inltree."+s.Name, 0)
|
||||
inlTreeSym.Type = objabi.SRODATA
|
||||
inlTreeSym.Type = SRODATA
|
||||
inlTreeSym.Attr |= AttrReachable | AttrDuplicateOK
|
||||
|
||||
for i, call := range pcln.InlTree {
|
||||
|
@ -443,7 +443,7 @@ const (
|
|||
// function for a pc. See src/runtime/symtab.go:findfunc for details.
|
||||
func (ctxt *Link) findfunctab() {
|
||||
t := ctxt.Syms.Lookup("runtime.findfunctab", 0)
|
||||
t.Type = objabi.SRODATA
|
||||
t.Type = SRODATA
|
||||
t.Attr |= AttrReachable
|
||||
t.Attr |= AttrLocal
|
||||
|
||||
|
|
|
@ -460,8 +460,8 @@ func Peinit(ctxt *Link) {
|
|||
|
||||
if Linkmode == LinkInternal {
|
||||
// some mingw libs depend on this symbol, for example, FindPESectionByName
|
||||
ctxt.xdefine("__image_base__", objabi.SDATA, PEBASE)
|
||||
ctxt.xdefine("_image_base__", objabi.SDATA, PEBASE)
|
||||
ctxt.xdefine("__image_base__", SDATA, PEBASE)
|
||||
ctxt.xdefine("_image_base__", SDATA, PEBASE)
|
||||
}
|
||||
|
||||
HEADR = PEFILEHEADR
|
||||
|
@ -516,7 +516,7 @@ func initdynimport(ctxt *Link) *Dll {
|
|||
dr = nil
|
||||
var m *Imp
|
||||
for _, s := range ctxt.Syms.Allsym {
|
||||
if !s.Attr.Reachable() || s.Type != objabi.SDYNIMPORT {
|
||||
if !s.Attr.Reachable() || s.Type != SDYNIMPORT {
|
||||
continue
|
||||
}
|
||||
for d = dr; d != nil; d = d.next {
|
||||
|
@ -558,7 +558,7 @@ func initdynimport(ctxt *Link) *Dll {
|
|||
// Add real symbol name
|
||||
for d := dr; d != nil; d = d.next {
|
||||
for m = d.ms; m != nil; m = m.next {
|
||||
m.s.Type = objabi.SDATA
|
||||
m.s.Type = SDATA
|
||||
Symgrow(m.s, int64(SysArch.PtrSize))
|
||||
dynName := m.s.Extname
|
||||
// only windows/386 requires stdcall decoration
|
||||
|
@ -567,7 +567,7 @@ func initdynimport(ctxt *Link) *Dll {
|
|||
}
|
||||
dynSym := ctxt.Syms.Lookup(dynName, 0)
|
||||
dynSym.Attr |= AttrReachable
|
||||
dynSym.Type = objabi.SHOSTOBJ
|
||||
dynSym.Type = SHOSTOBJ
|
||||
r := Addrel(m.s)
|
||||
r.Sym = dynSym
|
||||
r.Off = 0
|
||||
|
@ -578,10 +578,10 @@ func initdynimport(ctxt *Link) *Dll {
|
|||
} else {
|
||||
dynamic := ctxt.Syms.Lookup(".windynamic", 0)
|
||||
dynamic.Attr |= AttrReachable
|
||||
dynamic.Type = objabi.SWINDOWS
|
||||
dynamic.Type = SWINDOWS
|
||||
for d := dr; d != nil; d = d.next {
|
||||
for m = d.ms; m != nil; m = m.next {
|
||||
m.s.Type = objabi.SWINDOWS | objabi.SSUB
|
||||
m.s.Type = SWINDOWS | SSUB
|
||||
m.s.Sub = dynamic.Sub
|
||||
dynamic.Sub = m.s
|
||||
m.s.Value = dynamic.Size
|
||||
|
@ -936,7 +936,7 @@ func (ctxt *Link) dope() {
|
|||
rel := ctxt.Syms.Lookup(".rel", 0)
|
||||
|
||||
rel.Attr |= AttrReachable
|
||||
rel.Type = objabi.SELFROSECT
|
||||
rel.Type = SELFROSECT
|
||||
|
||||
initdynimport(ctxt)
|
||||
initdynexport(ctxt)
|
||||
|
@ -1009,7 +1009,7 @@ func writePESymTableRecords(ctxt *Link) int {
|
|||
// Only windows/386 requires underscore prefix on external symbols.
|
||||
if SysArch.Family == sys.I386 &&
|
||||
Linkmode == LinkExternal &&
|
||||
(s.Type == objabi.SHOSTOBJ || s.Attr.CgoExport()) {
|
||||
(s.Type == SHOSTOBJ || s.Attr.CgoExport()) {
|
||||
s.Name = "_" + s.Name
|
||||
}
|
||||
|
||||
|
@ -1020,10 +1020,10 @@ func writePESymTableRecords(ctxt *Link) int {
|
|||
// it still belongs to the .data section, not the .bss section.
|
||||
// Same for runtime.epclntab (type STEXT), it belongs to .text
|
||||
// section, not the .data section.
|
||||
if uint64(s.Value) >= Segdata.Vaddr+Segdata.Filelen && s.Type != objabi.SDATA && Linkmode == LinkExternal {
|
||||
if uint64(s.Value) >= Segdata.Vaddr+Segdata.Filelen && s.Type != SDATA && Linkmode == LinkExternal {
|
||||
value = int64(uint64(s.Value) - Segdata.Vaddr - Segdata.Filelen)
|
||||
sect = bsssect
|
||||
} else if uint64(s.Value) >= Segdata.Vaddr && s.Type != objabi.STEXT {
|
||||
} else if uint64(s.Value) >= Segdata.Vaddr && s.Type != STEXT {
|
||||
value = int64(uint64(s.Value) - Segdata.Vaddr)
|
||||
sect = datasect
|
||||
} else if uint64(s.Value) >= Segtext.Vaddr {
|
||||
|
@ -1041,7 +1041,7 @@ func writePESymTableRecords(ctxt *Link) int {
|
|||
typ = 0x0308 // "array of structs"
|
||||
}
|
||||
class := IMAGE_SYM_CLASS_EXTERNAL
|
||||
if s.Version != 0 || (s.Type&objabi.SHIDDEN != 0) || s.Attr.Local() {
|
||||
if s.Version != 0 || (s.Type&SHIDDEN != 0) || s.Attr.Local() {
|
||||
class = IMAGE_SYM_CLASS_STATIC
|
||||
}
|
||||
writeOneSymbol(s, value, sect, typ, uint8(class))
|
||||
|
|
152
src/cmd/link/internal/ld/symkind.go
Normal file
152
src/cmd/link/internal/ld/symkind.go
Normal file
|
@ -0,0 +1,152 @@
|
|||
// Derived from Inferno utils/6l/l.h and related files.
|
||||
// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/l.h
|
||||
//
|
||||
// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
|
||||
// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
|
||||
// Portions Copyright © 1997-1999 Vita Nuova Limited
|
||||
// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
|
||||
// Portions Copyright © 2004,2006 Bruce Ellis
|
||||
// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
|
||||
// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
|
||||
// Portions Copyright © 2009 The Go Authors. All rights reserved.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
package ld
|
||||
|
||||
// A SymKind describes the kind of memory represented by a symbol.
|
||||
type SymKind int16
|
||||
|
||||
// Defined SymKind values.
|
||||
//
|
||||
// TODO(rsc): Give idiomatic Go names.
|
||||
//go:generate stringer -type=SymKind
|
||||
const (
|
||||
Sxxx SymKind = iota
|
||||
STEXT
|
||||
SELFRXSECT
|
||||
|
||||
// Read-only sections.
|
||||
STYPE
|
||||
SSTRING
|
||||
SGOSTRING
|
||||
SGOFUNC
|
||||
SGCBITS
|
||||
SRODATA
|
||||
SFUNCTAB
|
||||
|
||||
SELFROSECT
|
||||
SMACHOPLT
|
||||
|
||||
// Read-only sections with relocations.
|
||||
//
|
||||
// Types STYPE-SFUNCTAB above are written to the .rodata section by default.
|
||||
// When linking a shared object, some conceptually "read only" types need to
|
||||
// be written to by relocations and putting them in a section called
|
||||
// ".rodata" interacts poorly with the system linkers. The GNU linkers
|
||||
// support this situation by arranging for sections of the name
|
||||
// ".data.rel.ro.XXX" to be mprotected read only by the dynamic linker after
|
||||
// relocations have applied, so when the Go linker is creating a shared
|
||||
// object it checks all objects of the above types and bumps any object that
|
||||
// has a relocation to it to the corresponding type below, which are then
|
||||
// written to sections with appropriate magic names.
|
||||
STYPERELRO
|
||||
SSTRINGRELRO
|
||||
SGOSTRINGRELRO
|
||||
SGOFUNCRELRO
|
||||
SGCBITSRELRO
|
||||
SRODATARELRO
|
||||
SFUNCTABRELRO
|
||||
|
||||
// Part of .data.rel.ro if it exists, otherwise part of .rodata.
|
||||
STYPELINK
|
||||
SITABLINK
|
||||
SSYMTAB
|
||||
SPCLNTAB
|
||||
|
||||
// Writable sections.
|
||||
SELFSECT
|
||||
SMACHO
|
||||
SMACHOGOT
|
||||
SWINDOWS
|
||||
SELFGOT
|
||||
SNOPTRDATA
|
||||
SINITARR
|
||||
SDATA
|
||||
SBSS
|
||||
SNOPTRBSS
|
||||
STLSBSS
|
||||
SXREF
|
||||
SMACHOSYMSTR
|
||||
SMACHOSYMTAB
|
||||
SMACHOINDIRECTPLT
|
||||
SMACHOINDIRECTGOT
|
||||
SFILE
|
||||
SFILEPATH
|
||||
SCONST
|
||||
SDYNIMPORT
|
||||
SHOSTOBJ
|
||||
SDWARFSECT
|
||||
SDWARFINFO
|
||||
SSUB = SymKind(1 << 8)
|
||||
SMASK = SymKind(SSUB - 1)
|
||||
SHIDDEN = SymKind(1 << 9)
|
||||
SCONTAINER = SymKind(1 << 10) // has a sub-symbol
|
||||
)
|
||||
|
||||
// abiSymKindToSymKind maps values read from object files (which are
|
||||
// of type cmd/internal/objabi.SymKind) to values of type SymKind.
|
||||
var abiSymKindToSymKind = [...]SymKind{
|
||||
Sxxx,
|
||||
STEXT,
|
||||
SRODATA,
|
||||
SNOPTRDATA,
|
||||
SDATA,
|
||||
SBSS,
|
||||
SNOPTRBSS,
|
||||
STLSBSS,
|
||||
SXREF,
|
||||
SCONST,
|
||||
SDWARFINFO,
|
||||
}
|
||||
|
||||
// ReadOnly are the symbol kinds that form read-only sections. In some
|
||||
// cases, if they will require relocations, they are transformed into
|
||||
// rel-ro sections using RelROMap.
|
||||
var ReadOnly = []SymKind{
|
||||
STYPE,
|
||||
SSTRING,
|
||||
SGOSTRING,
|
||||
SGOFUNC,
|
||||
SGCBITS,
|
||||
SRODATA,
|
||||
SFUNCTAB,
|
||||
}
|
||||
|
||||
// RelROMap describes the transformation of read-only symbols to rel-ro
|
||||
// symbols.
|
||||
var RelROMap = map[SymKind]SymKind{
|
||||
STYPE: STYPERELRO,
|
||||
SSTRING: SSTRINGRELRO,
|
||||
SGOSTRING: SGOSTRINGRELRO,
|
||||
SGOFUNC: SGOFUNCRELRO,
|
||||
SGCBITS: SGCBITSRELRO,
|
||||
SRODATA: SRODATARELRO,
|
||||
SFUNCTAB: SFUNCTABRELRO,
|
||||
}
|
16
src/cmd/link/internal/ld/symkind_string.go
Normal file
16
src/cmd/link/internal/ld/symkind_string.go
Normal file
|
@ -0,0 +1,16 @@
|
|||
// Code generated by "stringer -type=SymKind"; DO NOT EDIT.
|
||||
|
||||
package ld
|
||||
|
||||
import "fmt"
|
||||
|
||||
const _SymKind_name = "SxxxSTEXTSELFRXSECTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSMACHOPLTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASBSSSNOPTRBSSSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILESFILEPATHSCONSTSDYNIMPORTSHOSTOBJSDWARFSECTSDWARFINFO"
|
||||
|
||||
var _SymKind_index = [...]uint16{0, 4, 9, 19, 24, 31, 40, 47, 54, 61, 69, 79, 88, 98, 110, 124, 136, 148, 160, 173, 182, 191, 198, 206, 214, 220, 229, 237, 244, 254, 262, 267, 271, 280, 287, 292, 304, 316, 333, 350, 355, 364, 370, 380, 388, 398, 408}
|
||||
|
||||
func (i SymKind) String() string {
|
||||
if i < 0 || i >= SymKind(len(_SymKind_index)-1) {
|
||||
return fmt.Sprintf("SymKind(%d)", i)
|
||||
}
|
||||
return _SymKind_name[_SymKind_index[i]:_SymKind_index[i+1]]
|
||||
}
|
|
@ -109,7 +109,7 @@ func putelfsym(ctxt *Link, x *Symbol, s string, t SymbolType, addr int64, go_ *S
|
|||
}
|
||||
|
||||
var elfshnum int
|
||||
if xo.Type == objabi.SDYNIMPORT || xo.Type == objabi.SHOSTOBJ {
|
||||
if xo.Type == SDYNIMPORT || xo.Type == SHOSTOBJ {
|
||||
elfshnum = SHN_UNDEF
|
||||
} else {
|
||||
if xo.Sect == nil {
|
||||
|
@ -127,7 +127,7 @@ func putelfsym(ctxt *Link, x *Symbol, s string, t SymbolType, addr int64, go_ *S
|
|||
// maybe one day STB_WEAK.
|
||||
bind := STB_GLOBAL
|
||||
|
||||
if x.Version != 0 || (x.Type&objabi.SHIDDEN != 0) || x.Attr.Local() {
|
||||
if x.Version != 0 || (x.Type&SHIDDEN != 0) || x.Attr.Local() {
|
||||
bind = STB_LOCAL
|
||||
}
|
||||
|
||||
|
@ -144,7 +144,7 @@ func putelfsym(ctxt *Link, x *Symbol, s string, t SymbolType, addr int64, go_ *S
|
|||
addr -= int64(xo.Sect.Vaddr)
|
||||
}
|
||||
other := STV_DEFAULT
|
||||
if x.Type&objabi.SHIDDEN != 0 {
|
||||
if x.Type&SHIDDEN != 0 {
|
||||
other = STV_HIDDEN
|
||||
}
|
||||
if (Buildmode == BuildmodeCArchive || Buildmode == BuildmodePIE || ctxt.DynlinkingGo()) && SysArch.Family == sys.PPC64 && typ == STT_FUNC && x.Name != "runtime.duffzero" && x.Name != "runtime.duffcopy" {
|
||||
|
@ -162,7 +162,7 @@ func putelfsym(ctxt *Link, x *Symbol, s string, t SymbolType, addr int64, go_ *S
|
|||
s = strings.Replace(s, "·", ".", -1)
|
||||
}
|
||||
|
||||
if ctxt.DynlinkingGo() && bind == STB_GLOBAL && elfbind == STB_LOCAL && x.Type == objabi.STEXT {
|
||||
if ctxt.DynlinkingGo() && bind == STB_GLOBAL && elfbind == STB_LOCAL && x.Type == STEXT {
|
||||
// When dynamically linking, we want references to functions defined
|
||||
// in this module to always be to the function object, not to the
|
||||
// PLT. We force this by writing an additional local symbol for every
|
||||
|
@ -307,7 +307,7 @@ func (libs byPkg) Swap(a, b int) {
|
|||
func textsectionmap(ctxt *Link) uint32 {
|
||||
|
||||
t := ctxt.Syms.Lookup("runtime.textsectionmap", 0)
|
||||
t.Type = objabi.SRODATA
|
||||
t.Type = SRODATA
|
||||
t.Attr |= AttrReachable
|
||||
nsections := int64(0)
|
||||
|
||||
|
@ -363,40 +363,40 @@ func (ctxt *Link) symtab() {
|
|||
|
||||
// Define these so that they'll get put into the symbol table.
|
||||
// data.c:/^address will provide the actual values.
|
||||
ctxt.xdefine("runtime.text", objabi.STEXT, 0)
|
||||
ctxt.xdefine("runtime.text", STEXT, 0)
|
||||
|
||||
ctxt.xdefine("runtime.etext", objabi.STEXT, 0)
|
||||
ctxt.xdefine("runtime.itablink", objabi.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.eitablink", objabi.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.rodata", objabi.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.erodata", objabi.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.types", objabi.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.etypes", objabi.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.noptrdata", objabi.SNOPTRDATA, 0)
|
||||
ctxt.xdefine("runtime.enoptrdata", objabi.SNOPTRDATA, 0)
|
||||
ctxt.xdefine("runtime.data", objabi.SDATA, 0)
|
||||
ctxt.xdefine("runtime.edata", objabi.SDATA, 0)
|
||||
ctxt.xdefine("runtime.bss", objabi.SBSS, 0)
|
||||
ctxt.xdefine("runtime.ebss", objabi.SBSS, 0)
|
||||
ctxt.xdefine("runtime.noptrbss", objabi.SNOPTRBSS, 0)
|
||||
ctxt.xdefine("runtime.enoptrbss", objabi.SNOPTRBSS, 0)
|
||||
ctxt.xdefine("runtime.end", objabi.SBSS, 0)
|
||||
ctxt.xdefine("runtime.epclntab", objabi.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.esymtab", objabi.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.etext", STEXT, 0)
|
||||
ctxt.xdefine("runtime.itablink", SRODATA, 0)
|
||||
ctxt.xdefine("runtime.eitablink", SRODATA, 0)
|
||||
ctxt.xdefine("runtime.rodata", SRODATA, 0)
|
||||
ctxt.xdefine("runtime.erodata", SRODATA, 0)
|
||||
ctxt.xdefine("runtime.types", SRODATA, 0)
|
||||
ctxt.xdefine("runtime.etypes", SRODATA, 0)
|
||||
ctxt.xdefine("runtime.noptrdata", SNOPTRDATA, 0)
|
||||
ctxt.xdefine("runtime.enoptrdata", SNOPTRDATA, 0)
|
||||
ctxt.xdefine("runtime.data", SDATA, 0)
|
||||
ctxt.xdefine("runtime.edata", SDATA, 0)
|
||||
ctxt.xdefine("runtime.bss", SBSS, 0)
|
||||
ctxt.xdefine("runtime.ebss", SBSS, 0)
|
||||
ctxt.xdefine("runtime.noptrbss", SNOPTRBSS, 0)
|
||||
ctxt.xdefine("runtime.enoptrbss", SNOPTRBSS, 0)
|
||||
ctxt.xdefine("runtime.end", SBSS, 0)
|
||||
ctxt.xdefine("runtime.epclntab", SRODATA, 0)
|
||||
ctxt.xdefine("runtime.esymtab", SRODATA, 0)
|
||||
|
||||
// garbage collection symbols
|
||||
s := ctxt.Syms.Lookup("runtime.gcdata", 0)
|
||||
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Size = 0
|
||||
s.Attr |= AttrReachable
|
||||
ctxt.xdefine("runtime.egcdata", objabi.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.egcdata", SRODATA, 0)
|
||||
|
||||
s = ctxt.Syms.Lookup("runtime.gcbss", 0)
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Size = 0
|
||||
s.Attr |= AttrReachable
|
||||
ctxt.xdefine("runtime.egcbss", objabi.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.egcbss", SRODATA, 0)
|
||||
|
||||
// pseudo-symbols to mark locations of type, string, and go string data.
|
||||
var symtype *Symbol
|
||||
|
@ -404,28 +404,28 @@ func (ctxt *Link) symtab() {
|
|||
if UseRelro() && (Buildmode == BuildmodeCArchive || Buildmode == BuildmodeCShared || Buildmode == BuildmodePIE) {
|
||||
s = ctxt.Syms.Lookup("type.*", 0)
|
||||
|
||||
s.Type = objabi.STYPE
|
||||
s.Type = STYPE
|
||||
s.Size = 0
|
||||
s.Attr |= AttrReachable
|
||||
symtype = s
|
||||
|
||||
s = ctxt.Syms.Lookup("typerel.*", 0)
|
||||
|
||||
s.Type = objabi.STYPERELRO
|
||||
s.Type = STYPERELRO
|
||||
s.Size = 0
|
||||
s.Attr |= AttrReachable
|
||||
symtyperel = s
|
||||
} else if !ctxt.DynlinkingGo() {
|
||||
s = ctxt.Syms.Lookup("type.*", 0)
|
||||
|
||||
s.Type = objabi.STYPE
|
||||
s.Type = STYPE
|
||||
s.Size = 0
|
||||
s.Attr |= AttrReachable
|
||||
symtype = s
|
||||
symtyperel = s
|
||||
}
|
||||
|
||||
groupSym := func(name string, t objabi.SymKind) *Symbol {
|
||||
groupSym := func(name string, t SymKind) *Symbol {
|
||||
s := ctxt.Syms.Lookup(name, 0)
|
||||
s.Type = t
|
||||
s.Size = 0
|
||||
|
@ -433,26 +433,26 @@ func (ctxt *Link) symtab() {
|
|||
return s
|
||||
}
|
||||
var (
|
||||
symgostring = groupSym("go.string.*", objabi.SGOSTRING)
|
||||
symgofunc = groupSym("go.func.*", objabi.SGOFUNC)
|
||||
symgcbits = groupSym("runtime.gcbits.*", objabi.SGCBITS)
|
||||
symgostring = groupSym("go.string.*", SGOSTRING)
|
||||
symgofunc = groupSym("go.func.*", SGOFUNC)
|
||||
symgcbits = groupSym("runtime.gcbits.*", SGCBITS)
|
||||
)
|
||||
|
||||
var symgofuncrel *Symbol
|
||||
if !ctxt.DynlinkingGo() {
|
||||
if UseRelro() {
|
||||
symgofuncrel = groupSym("go.funcrel.*", objabi.SGOFUNCRELRO)
|
||||
symgofuncrel = groupSym("go.funcrel.*", SGOFUNCRELRO)
|
||||
} else {
|
||||
symgofuncrel = symgofunc
|
||||
}
|
||||
}
|
||||
|
||||
symitablink := ctxt.Syms.Lookup("runtime.itablink", 0)
|
||||
symitablink.Type = objabi.SITABLINK
|
||||
symitablink.Type = SITABLINK
|
||||
|
||||
symt = ctxt.Syms.Lookup("runtime.symtab", 0)
|
||||
symt.Attr |= AttrLocal
|
||||
symt.Type = objabi.SSYMTAB
|
||||
symt.Type = SSYMTAB
|
||||
symt.Size = 0
|
||||
symt.Attr |= AttrReachable
|
||||
|
||||
|
@ -463,7 +463,7 @@ func (ctxt *Link) symtab() {
|
|||
// just defined above will be first.
|
||||
// hide the specific symbols.
|
||||
for _, s := range ctxt.Syms.Allsym {
|
||||
if !s.Attr.Reachable() || s.Attr.Special() || s.Type != objabi.SRODATA {
|
||||
if !s.Attr.Reachable() || s.Attr.Special() || s.Type != SRODATA {
|
||||
continue
|
||||
}
|
||||
|
||||
|
@ -473,31 +473,31 @@ func (ctxt *Link) symtab() {
|
|||
s.Attr |= AttrHidden
|
||||
}
|
||||
if UseRelro() {
|
||||
s.Type = objabi.STYPERELRO
|
||||
s.Type = STYPERELRO
|
||||
s.Outer = symtyperel
|
||||
} else {
|
||||
s.Type = objabi.STYPE
|
||||
s.Type = STYPE
|
||||
s.Outer = symtype
|
||||
}
|
||||
|
||||
case strings.HasPrefix(s.Name, "go.importpath.") && UseRelro():
|
||||
// Keep go.importpath symbols in the same section as types and
|
||||
// names, as they can be referred to by a section offset.
|
||||
s.Type = objabi.STYPERELRO
|
||||
s.Type = STYPERELRO
|
||||
|
||||
case strings.HasPrefix(s.Name, "go.itablink."):
|
||||
nitablinks++
|
||||
s.Type = objabi.SITABLINK
|
||||
s.Type = SITABLINK
|
||||
s.Attr |= AttrHidden
|
||||
s.Outer = symitablink
|
||||
|
||||
case strings.HasPrefix(s.Name, "go.string."):
|
||||
s.Type = objabi.SGOSTRING
|
||||
s.Type = SGOSTRING
|
||||
s.Attr |= AttrHidden
|
||||
s.Outer = symgostring
|
||||
|
||||
case strings.HasPrefix(s.Name, "runtime.gcbits."):
|
||||
s.Type = objabi.SGCBITS
|
||||
s.Type = SGCBITS
|
||||
s.Attr |= AttrHidden
|
||||
s.Outer = symgcbits
|
||||
|
||||
|
@ -506,10 +506,10 @@ func (ctxt *Link) symtab() {
|
|||
s.Attr |= AttrHidden
|
||||
}
|
||||
if UseRelro() {
|
||||
s.Type = objabi.SGOFUNCRELRO
|
||||
s.Type = SGOFUNCRELRO
|
||||
s.Outer = symgofuncrel
|
||||
} else {
|
||||
s.Type = objabi.SGOFUNC
|
||||
s.Type = SGOFUNC
|
||||
s.Outer = symgofunc
|
||||
}
|
||||
|
||||
|
@ -517,7 +517,7 @@ func (ctxt *Link) symtab() {
|
|||
strings.HasPrefix(s.Name, "gclocals."),
|
||||
strings.HasPrefix(s.Name, "gclocals·"),
|
||||
strings.HasPrefix(s.Name, "inltree."):
|
||||
s.Type = objabi.SGOFUNC
|
||||
s.Type = SGOFUNC
|
||||
s.Attr |= AttrHidden
|
||||
s.Outer = symgofunc
|
||||
s.Align = 4
|
||||
|
@ -528,7 +528,7 @@ func (ctxt *Link) symtab() {
|
|||
if Buildmode == BuildmodeShared {
|
||||
abihashgostr := ctxt.Syms.Lookup("go.link.abihash."+filepath.Base(*flagOutfile), 0)
|
||||
abihashgostr.Attr |= AttrReachable
|
||||
abihashgostr.Type = objabi.SRODATA
|
||||
abihashgostr.Type = SRODATA
|
||||
hashsym := ctxt.Syms.Lookup("go.link.abihashbytes", 0)
|
||||
Addaddr(ctxt, abihashgostr, hashsym)
|
||||
adduint(ctxt, abihashgostr, uint64(hashsym.Size))
|
||||
|
@ -537,12 +537,12 @@ func (ctxt *Link) symtab() {
|
|||
for _, l := range ctxt.Library {
|
||||
s := ctxt.Syms.Lookup("go.link.pkghashbytes."+l.Pkg, 0)
|
||||
s.Attr |= AttrReachable
|
||||
s.Type = objabi.SRODATA
|
||||
s.Type = SRODATA
|
||||
s.Size = int64(len(l.hash))
|
||||
s.P = []byte(l.hash)
|
||||
str := ctxt.Syms.Lookup("go.link.pkghash."+l.Pkg, 0)
|
||||
str.Attr |= AttrReachable
|
||||
str.Type = objabi.SRODATA
|
||||
str.Type = SRODATA
|
||||
Addaddr(ctxt, str, s)
|
||||
adduint(ctxt, str, uint64(len(l.hash)))
|
||||
}
|
||||
|
@ -607,7 +607,7 @@ func (ctxt *Link) symtab() {
|
|||
// The ptab slice
|
||||
if ptab := ctxt.Syms.ROLookup("go.plugin.tabs", 0); ptab != nil && ptab.Attr.Reachable() {
|
||||
ptab.Attr |= AttrLocal
|
||||
ptab.Type = objabi.SRODATA
|
||||
ptab.Type = SRODATA
|
||||
|
||||
nentries := uint64(len(ptab.P) / 8) // sizeof(nameOff) + sizeof(typeOff)
|
||||
Addaddr(ctxt, moduledata, ptab)
|
||||
|
@ -624,7 +624,7 @@ func (ctxt *Link) symtab() {
|
|||
pkghashes := ctxt.Syms.Lookup("go.link.pkghashes", 0)
|
||||
pkghashes.Attr |= AttrReachable
|
||||
pkghashes.Attr |= AttrLocal
|
||||
pkghashes.Type = objabi.SRODATA
|
||||
pkghashes.Type = SRODATA
|
||||
|
||||
for i, l := range ctxt.Library {
|
||||
// pkghashes[i].name
|
||||
|
@ -658,7 +658,7 @@ func (ctxt *Link) symtab() {
|
|||
modulehashes := ctxt.Syms.Lookup("go.link.abihashes", 0)
|
||||
modulehashes.Attr |= AttrReachable
|
||||
modulehashes.Attr |= AttrLocal
|
||||
modulehashes.Type = objabi.SRODATA
|
||||
modulehashes.Type = SRODATA
|
||||
|
||||
for i, shlib := range ctxt.Shlibs {
|
||||
// modulehashes[i].modulename
|
||||
|
@ -688,8 +688,8 @@ func (ctxt *Link) symtab() {
|
|||
Symgrow(moduledata, moduledata.Size)
|
||||
|
||||
lastmoduledatap := ctxt.Syms.Lookup("runtime.lastmoduledatap", 0)
|
||||
if lastmoduledatap.Type != objabi.SDYNIMPORT {
|
||||
lastmoduledatap.Type = objabi.SNOPTRDATA
|
||||
if lastmoduledatap.Type != SDYNIMPORT {
|
||||
lastmoduledatap.Type = SNOPTRDATA
|
||||
lastmoduledatap.Size = 0 // overwrite existing value
|
||||
Addaddr(ctxt, lastmoduledatap, moduledata)
|
||||
}
|
||||
|
|
|
@ -33,7 +33,7 @@ func (ctxt *Link) typelink() {
|
|||
sort.Sort(typelinks)
|
||||
|
||||
tl := ctxt.Syms.Lookup("runtime.typelink", 0)
|
||||
tl.Type = objabi.STYPELINK
|
||||
tl.Type = STYPELINK
|
||||
tl.Attr |= AttrReachable | AttrLocal
|
||||
tl.Size = int64(4 * len(typelinks))
|
||||
tl.P = make([]byte, tl.Size)
|
||||
|
|
|
@ -114,7 +114,7 @@ func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
|
|||
rs = rs.Outer
|
||||
}
|
||||
|
||||
if rs.Type != objabi.SHOSTOBJ && rs.Type != objabi.SDYNIMPORT && rs.Sect == nil {
|
||||
if rs.Type != ld.SHOSTOBJ && rs.Type != ld.SDYNIMPORT && rs.Sect == nil {
|
||||
ld.Errorf(s, "missing section for %s", rs.Name)
|
||||
}
|
||||
r.Xsym = rs
|
||||
|
|
|
@ -120,7 +120,7 @@ func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
|
|||
rs = rs.Outer
|
||||
}
|
||||
|
||||
if rs.Type != objabi.SHOSTOBJ && rs.Type != objabi.SDYNIMPORT && rs.Sect == nil {
|
||||
if rs.Type != ld.SHOSTOBJ && rs.Type != ld.SDYNIMPORT && rs.Sect == nil {
|
||||
ld.Errorf(s, "missing section for %s", rs.Name)
|
||||
}
|
||||
r.Xsym = rs
|
||||
|
|
|
@ -91,7 +91,7 @@ func genplt(ctxt *ld.Link) {
|
|||
for _, s := range ctxt.Textp {
|
||||
for i := range s.R {
|
||||
r := &s.R[i]
|
||||
if r.Type != 256+ld.R_PPC64_REL24 || r.Sym.Type != objabi.SDYNIMPORT {
|
||||
if r.Type != 256+ld.R_PPC64_REL24 || r.Sym.Type != ld.SDYNIMPORT {
|
||||
continue
|
||||
}
|
||||
|
||||
|
@ -131,12 +131,12 @@ func genplt(ctxt *ld.Link) {
|
|||
|
||||
func genaddmoduledata(ctxt *ld.Link) {
|
||||
addmoduledata := ctxt.Syms.ROLookup("runtime.addmoduledata", 0)
|
||||
if addmoduledata.Type == objabi.STEXT {
|
||||
if addmoduledata.Type == ld.STEXT {
|
||||
return
|
||||
}
|
||||
addmoduledata.Attr |= ld.AttrReachable
|
||||
initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0)
|
||||
initfunc.Type = objabi.STEXT
|
||||
initfunc.Type = ld.STEXT
|
||||
initfunc.Attr |= ld.AttrLocal
|
||||
initfunc.Attr |= ld.AttrReachable
|
||||
o := func(op uint32) {
|
||||
|
@ -186,7 +186,7 @@ func genaddmoduledata(ctxt *ld.Link) {
|
|||
ctxt.Textp = append(ctxt.Textp, initfunc)
|
||||
initarray_entry.Attr |= ld.AttrReachable
|
||||
initarray_entry.Attr |= ld.AttrLocal
|
||||
initarray_entry.Type = objabi.SINITARR
|
||||
initarray_entry.Type = ld.SINITARR
|
||||
ld.Addaddr(ctxt, initarray_entry, initfunc)
|
||||
}
|
||||
|
||||
|
@ -211,7 +211,7 @@ func gencallstub(ctxt *ld.Link, abicase int, stub *ld.Symbol, targ *ld.Symbol) {
|
|||
|
||||
plt := ctxt.Syms.Lookup(".plt", 0)
|
||||
|
||||
stub.Type = objabi.STEXT
|
||||
stub.Type = ld.STEXT
|
||||
|
||||
// Save TOC pointer in TOC save slot
|
||||
ld.Adduint32(ctxt, stub, 0xf8410018) // std r2,24(r1)
|
||||
|
@ -267,7 +267,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
// to use r12 to compute r2.)
|
||||
r.Add += int64(r.Sym.Localentry) * 4
|
||||
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
// Should have been handled in elfsetupplt
|
||||
ld.Errorf(s, "unexpected R_PPC64_REL24 for dyn import")
|
||||
}
|
||||
|
@ -278,7 +278,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
r.Type = objabi.R_PCREL
|
||||
r.Add += 4
|
||||
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected R_PPC_REL32 for dyn import")
|
||||
}
|
||||
|
||||
|
@ -286,7 +286,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
|
||||
case 256 + ld.R_PPC64_ADDR64:
|
||||
r.Type = objabi.R_ADDR
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
// These happen in .toc sections
|
||||
ld.Adddynsym(ctxt, targ)
|
||||
|
||||
|
@ -349,7 +349,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
}
|
||||
|
||||
// Handle references to ELF symbols from our own object files.
|
||||
if targ.Type != objabi.SDYNIMPORT {
|
||||
if targ.Type != ld.SDYNIMPORT {
|
||||
return true
|
||||
}
|
||||
|
||||
|
@ -611,7 +611,7 @@ func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
|
|||
rs = rs.Outer
|
||||
}
|
||||
|
||||
if rs.Type != objabi.SHOSTOBJ && rs.Type != objabi.SDYNIMPORT && rs.Sect == nil {
|
||||
if rs.Type != ld.SHOSTOBJ && rs.Type != ld.SDYNIMPORT && rs.Sect == nil {
|
||||
ld.Errorf(s, "missing section for %s", rs.Name)
|
||||
}
|
||||
r.Xsym = rs
|
||||
|
|
|
@ -52,14 +52,14 @@ func gentext(ctxt *ld.Link) {
|
|||
return
|
||||
}
|
||||
addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0)
|
||||
if addmoduledata.Type == objabi.STEXT && ld.Buildmode != ld.BuildmodePlugin {
|
||||
if addmoduledata.Type == ld.STEXT && ld.Buildmode != ld.BuildmodePlugin {
|
||||
// we're linking a module containing the runtime -> no need for
|
||||
// an init function
|
||||
return
|
||||
}
|
||||
addmoduledata.Attr |= ld.AttrReachable
|
||||
initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0)
|
||||
initfunc.Type = objabi.STEXT
|
||||
initfunc.Type = ld.STEXT
|
||||
initfunc.Attr |= ld.AttrLocal
|
||||
initfunc.Attr |= ld.AttrReachable
|
||||
|
||||
|
@ -96,7 +96,7 @@ func gentext(ctxt *ld.Link) {
|
|||
initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0)
|
||||
initarray_entry.Attr |= ld.AttrLocal
|
||||
initarray_entry.Attr |= ld.AttrReachable
|
||||
initarray_entry.Type = objabi.SINITARR
|
||||
initarray_entry.Type = ld.SINITARR
|
||||
ld.Addaddr(ctxt, initarray_entry, initfunc)
|
||||
}
|
||||
|
||||
|
@ -120,7 +120,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
256 + ld.R_390_16,
|
||||
256 + ld.R_390_32,
|
||||
256 + ld.R_390_64:
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected R_390_nn relocation for dynamic symbol %s", targ.Name)
|
||||
}
|
||||
r.Type = objabi.R_ADDR
|
||||
|
@ -129,10 +129,10 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
case 256 + ld.R_390_PC16,
|
||||
256 + ld.R_390_PC32,
|
||||
256 + ld.R_390_PC64:
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected R_390_PCnn relocation for dynamic symbol %s", targ.Name)
|
||||
}
|
||||
if targ.Type == 0 || targ.Type == objabi.SXREF {
|
||||
if targ.Type == 0 || targ.Type == ld.SXREF {
|
||||
ld.Errorf(s, "unknown symbol %s in pcrel", targ.Name)
|
||||
}
|
||||
r.Type = objabi.R_PCREL
|
||||
|
@ -150,7 +150,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
r.Type = objabi.R_PCREL
|
||||
r.Variant = ld.RV_390_DBL
|
||||
r.Add += int64(r.Siz)
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
addpltsym(ctxt, targ)
|
||||
r.Sym = ctxt.Syms.Lookup(".plt", 0)
|
||||
r.Add += int64(targ.Plt)
|
||||
|
@ -161,7 +161,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
256 + ld.R_390_PLT64:
|
||||
r.Type = objabi.R_PCREL
|
||||
r.Add += int64(r.Siz)
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
addpltsym(ctxt, targ)
|
||||
r.Sym = ctxt.Syms.Lookup(".plt", 0)
|
||||
r.Add += int64(targ.Plt)
|
||||
|
@ -185,7 +185,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
return false
|
||||
|
||||
case 256 + ld.R_390_GOTOFF:
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected R_390_GOTOFF relocation for dynamic symbol %s", targ.Name)
|
||||
}
|
||||
r.Type = objabi.R_GOTOFF
|
||||
|
@ -202,7 +202,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
r.Type = objabi.R_PCREL
|
||||
r.Variant = ld.RV_390_DBL
|
||||
r.Add += int64(r.Siz)
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected R_390_PCnnDBL relocation for dynamic symbol %s", targ.Name)
|
||||
}
|
||||
return true
|
||||
|
@ -225,7 +225,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
return true
|
||||
}
|
||||
// Handle references to ELF symbols from our own object files.
|
||||
if targ.Type != objabi.SDYNIMPORT {
|
||||
if targ.Type != ld.SDYNIMPORT {
|
||||
return true
|
||||
}
|
||||
|
||||
|
@ -286,7 +286,7 @@ func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
|
|||
case objabi.R_PCRELDBL, objabi.R_CALL:
|
||||
isdbl = true
|
||||
}
|
||||
if r.Xsym.Type == objabi.SDYNIMPORT && (r.Xsym.ElfType == elf.STT_FUNC || r.Type == objabi.R_CALL) {
|
||||
if r.Xsym.Type == ld.SDYNIMPORT && (r.Xsym.ElfType == elf.STT_FUNC || r.Type == objabi.R_CALL) {
|
||||
if isdbl {
|
||||
switch r.Siz {
|
||||
case 2:
|
||||
|
|
|
@ -81,7 +81,7 @@ func gentext(ctxt *ld.Link) {
|
|||
{"di", 7},
|
||||
} {
|
||||
thunkfunc := ctxt.Syms.Lookup("__x86.get_pc_thunk."+r.name, 0)
|
||||
thunkfunc.Type = objabi.STEXT
|
||||
thunkfunc.Type = ld.STEXT
|
||||
thunkfunc.Attr |= ld.AttrLocal
|
||||
thunkfunc.Attr |= ld.AttrReachable //TODO: remove?
|
||||
o := func(op ...uint8) {
|
||||
|
@ -100,7 +100,7 @@ func gentext(ctxt *ld.Link) {
|
|||
ctxt.Textp = append(thunks, ctxt.Textp...) // keep Textp in dependency order
|
||||
|
||||
addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0)
|
||||
if addmoduledata.Type == objabi.STEXT && ld.Buildmode != ld.BuildmodePlugin {
|
||||
if addmoduledata.Type == ld.STEXT && ld.Buildmode != ld.BuildmodePlugin {
|
||||
// we're linking a module containing the runtime -> no need for
|
||||
// an init function
|
||||
return
|
||||
|
@ -109,7 +109,7 @@ func gentext(ctxt *ld.Link) {
|
|||
addmoduledata.Attr |= ld.AttrReachable
|
||||
|
||||
initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0)
|
||||
initfunc.Type = objabi.STEXT
|
||||
initfunc.Type = ld.STEXT
|
||||
initfunc.Attr |= ld.AttrLocal
|
||||
initfunc.Attr |= ld.AttrReachable
|
||||
o := func(op ...uint8) {
|
||||
|
@ -160,7 +160,7 @@ func gentext(ctxt *ld.Link) {
|
|||
initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0)
|
||||
initarray_entry.Attr |= ld.AttrReachable
|
||||
initarray_entry.Attr |= ld.AttrLocal
|
||||
initarray_entry.Type = objabi.SINITARR
|
||||
initarray_entry.Type = ld.SINITARR
|
||||
ld.Addaddr(ctxt, initarray_entry, initfunc)
|
||||
}
|
||||
|
||||
|
@ -176,10 +176,10 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
|
||||
// Handle relocations found in ELF object files.
|
||||
case 256 + ld.R_386_PC32:
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected R_386_PC32 relocation for dynamic symbol %s", targ.Name)
|
||||
}
|
||||
if targ.Type == 0 || targ.Type == objabi.SXREF {
|
||||
if targ.Type == 0 || targ.Type == ld.SXREF {
|
||||
ld.Errorf(s, "unknown symbol %s in pcrel", targ.Name)
|
||||
}
|
||||
r.Type = objabi.R_PCREL
|
||||
|
@ -189,7 +189,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
case 256 + ld.R_386_PLT32:
|
||||
r.Type = objabi.R_PCREL
|
||||
r.Add += 4
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
addpltsym(ctxt, targ)
|
||||
r.Sym = ctxt.Syms.Lookup(".plt", 0)
|
||||
r.Add += int64(targ.Plt)
|
||||
|
@ -198,7 +198,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
return true
|
||||
|
||||
case 256 + ld.R_386_GOT32, 256 + ld.R_386_GOT32X:
|
||||
if targ.Type != objabi.SDYNIMPORT {
|
||||
if targ.Type != ld.SDYNIMPORT {
|
||||
// have symbol
|
||||
if r.Off >= 2 && s.P[r.Off-2] == 0x8b {
|
||||
// turn MOVL of GOT entry into LEAL of symbol address, relative to GOT.
|
||||
|
@ -239,7 +239,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
return true
|
||||
|
||||
case 256 + ld.R_386_32:
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected R_386_32 relocation for dynamic symbol %s", targ.Name)
|
||||
}
|
||||
r.Type = objabi.R_ADDR
|
||||
|
@ -247,13 +247,13 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
|
||||
case 512 + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 0:
|
||||
r.Type = objabi.R_ADDR
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
ld.Errorf(s, "unexpected reloc for dynamic symbol %s", targ.Name)
|
||||
}
|
||||
return true
|
||||
|
||||
case 512 + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 1:
|
||||
if targ.Type == objabi.SDYNIMPORT {
|
||||
if targ.Type == ld.SDYNIMPORT {
|
||||
addpltsym(ctxt, targ)
|
||||
r.Sym = ctxt.Syms.Lookup(".plt", 0)
|
||||
r.Add = int64(targ.Plt)
|
||||
|
@ -265,7 +265,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
return true
|
||||
|
||||
case 512 + ld.MACHO_FAKE_GOTPCREL:
|
||||
if targ.Type != objabi.SDYNIMPORT {
|
||||
if targ.Type != ld.SDYNIMPORT {
|
||||
// have symbol
|
||||
// turn MOVL of GOT entry into LEAL of symbol itself
|
||||
if r.Off < 2 || s.P[r.Off-2] != 0x8b {
|
||||
|
@ -286,7 +286,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
}
|
||||
|
||||
// Handle references to ELF symbols from our own object files.
|
||||
if targ.Type != objabi.SDYNIMPORT {
|
||||
if targ.Type != ld.SDYNIMPORT {
|
||||
return true
|
||||
}
|
||||
switch r.Type {
|
||||
|
@ -298,7 +298,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
return true
|
||||
|
||||
case objabi.R_ADDR:
|
||||
if s.Type != objabi.SDATA {
|
||||
if s.Type != ld.SDATA {
|
||||
break
|
||||
}
|
||||
if ld.Iself {
|
||||
|
@ -325,7 +325,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||
ld.Adddynsym(ctxt, targ)
|
||||
|
||||
got := ctxt.Syms.Lookup(".got", 0)
|
||||
s.Type = got.Type | objabi.SSUB
|
||||
s.Type = got.Type | ld.SSUB
|
||||
s.Outer = got
|
||||
s.Sub = got.Sub
|
||||
got.Sub = s
|
||||
|
@ -373,7 +373,7 @@ func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
|
|||
|
||||
case objabi.R_CALL:
|
||||
if r.Siz == 4 {
|
||||
if r.Xsym.Type == objabi.SDYNIMPORT {
|
||||
if r.Xsym.Type == ld.SDYNIMPORT {
|
||||
ld.Thearch.Lput(ld.R_386_PLT32 | uint32(elfsym)<<8)
|
||||
} else {
|
||||
ld.Thearch.Lput(ld.R_386_PC32 | uint32(elfsym)<<8)
|
||||
|
@ -414,7 +414,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int {
|
|||
|
||||
rs := r.Xsym
|
||||
|
||||
if rs.Type == objabi.SHOSTOBJ {
|
||||
if rs.Type == ld.SHOSTOBJ {
|
||||
if rs.Dynid < 0 {
|
||||
ld.Errorf(s, "reloc %d to non-macho symbol %s type=%d", r.Type, rs.Name, rs.Type)
|
||||
return -1
|
||||
|
|
Loading…
Reference in a new issue