continue
}
- if sy.Dynimpvers != "" {
- need[sy.Dynid] = addelflib(&needlib, sy.Dynimplib, sy.Dynimpvers)
+ if sy.Dynimpvers() != "" {
+ need[sy.Dynid] = addelflib(&needlib, sy.Dynimplib(), sy.Dynimpvers())
}
name := sy.Extname
/* size of object */
d.AddUint64(ctxt.Arch, uint64(s.Size))
- if ctxt.Arch.Family == sys.AMD64 && !s.Attr.CgoExportDynamic() && s.Dynimplib != "" && !seenlib[s.Dynimplib] {
- Elfwritedynent(ctxt, ctxt.Syms.Lookup(".dynamic", 0), DT_NEEDED, uint64(Addstring(ctxt.Syms.Lookup(".dynstr", 0), s.Dynimplib)))
+ if ctxt.Arch.Family == sys.AMD64 && !s.Attr.CgoExportDynamic() && s.Dynimplib() != "" && !seenlib[s.Dynimplib()] {
+ Elfwritedynent(ctxt, ctxt.Syms.Lookup(".dynamic", 0), DT_NEEDED, uint64(Addstring(ctxt.Syms.Lookup(".dynstr", 0), s.Dynimplib())))
}
} else {
s.Dynid = int32(Nelfsym)
}
s := ctxt.Syms.Lookup(local, 0)
if s.Type == 0 || s.Type == sym.SXREF || s.Type == sym.SHOSTOBJ {
- s.Dynimplib = lib
+ s.SetDynimplib(lib)
s.Extname = remote
- s.Dynimpvers = q
+ s.SetDynimpvers(q)
if s.Type != sym.SHOSTOBJ {
s.Type = sym.SDYNIMPORT
}
// export overrides import, for openbsd/cgo.
// see issue 4878.
- if s.Dynimplib != "" {
- s.Dynimplib = ""
+ if s.Dynimplib() != "" {
+ s.ResetDyninfo()
s.Extname = ""
- s.Dynimpvers = ""
s.Type = 0
}
// 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() {
+ if s.Extname != "" && s.Dynimplib() != "" && !s.Attr.CgoExport() {
s.Type = sym.SDYNIMPORT
} else {
s.Type = 0
continue
}
for d = dr; d != nil; d = d.next {
- if d.name == s.Dynimplib {
+ if d.name == s.Dynimplib() {
m = new(Imp)
break
}
if d == nil {
d = new(Dll)
- d.name = s.Dynimplib
+ d.name = s.Dynimplib()
d.next = dr
dr = d
m = new(Imp)
s.Type = sect.sym.Type
s.Attr |= sym.AttrSubSymbol
if !s.Attr.CgoExportDynamic() {
- s.Dynimplib = "" // satisfy dynimport
+ s.SetDynimplib("") // satisfy dynimport
}
s.Value = int64(elfsym.value)
s.Size = int64(elfsym.size)
s.Outer = outer
s.Value = int64(machsym.value - sect.addr)
if !s.Attr.CgoExportDynamic() {
- s.Dynimplib = "" // satisfy dynimport
+ s.SetDynimplib("") // satisfy dynimport
}
if outer.Type == sym.STEXT {
if s.Attr.External() && !s.Attr.DuplicateOK() {
// ElfType is set for symbols read from shared libraries by ldshlibsyms. It
// is not set for symbols defined by the packages being linked or by symbols
// read by ldelf (and so is left as elf.STT_NOTYPE).
- ElfType elf.SymType
- Sub *Symbol
- Outer *Symbol
- Gotype *Symbol
- File string
- Dynimplib string
- Dynimpvers string
- Sect *Section
- FuncInfo *FuncInfo
- Lib *Library // Package defining this symbol
+ ElfType elf.SymType
+ Sub *Symbol
+ Outer *Symbol
+ Gotype *Symbol
+ File string
+ dyninfo *dynimp
+ Sect *Section
+ FuncInfo *FuncInfo
+ Lib *Library // Package defining this symbol
// P contains the raw symbol data.
P []byte
R []Reloc
}
+type dynimp struct {
+ dynimplib string
+ dynimpvers string
+}
+
func (s *Symbol) String() string {
if s.Version == 0 {
return s.Name
return off + wid
}
+func (s *Symbol) Dynimplib() string {
+ if s.dyninfo == nil {
+ return ""
+ }
+ return s.dyninfo.dynimplib
+}
+
+func (s *Symbol) Dynimpvers() string {
+ if s.dyninfo == nil {
+ return ""
+ }
+ return s.dyninfo.dynimpvers
+}
+
+func (s *Symbol) SetDynimplib(lib string) {
+ if s.dyninfo == nil {
+ s.dyninfo = &dynimp{dynimplib: lib}
+ } else {
+ s.dyninfo.dynimplib = lib
+ }
+}
+
+func (s *Symbol) SetDynimpvers(vers string) {
+ if s.dyninfo == nil {
+ s.dyninfo = &dynimp{dynimpvers: vers}
+ } else {
+ s.dyninfo.dynimpvers = vers
+ }
+}
+
+func (s *Symbol) ResetDyninfo() {
+ s.dyninfo = nil
+}
+
// SortSub sorts a linked-list (by Sub) of *Symbol by Value.
// Used for sub-symbols when loading host objects (see e.g. ldelf.go).
func SortSub(l *Symbol) *Symbol {