if elfobj.machine == ElfMachPower64 {
flag := int(elfsym.other) >> 5
if 2 <= flag && flag <= 6 {
- s.Localentry = 1 << uint(flag-2)
+ s.SetLocalentry(1 << uint(flag-2))
} else if flag == 7 {
return errorf("%v: invalid sym.other 0x%x", s, elfsym.other)
}
// callee. Hence, we need to go to the local entry
// point. (If we don't do this, the callee will try
// to use r12 to compute r2.)
- r.Add += int64(r.Sym.Localentry) * 4
+ r.Add += int64(r.Sym.Localentry()) * 4
if targ.Type == sym.SDYNIMPORT {
// Should have been handled in elfsetupplt
_32bit uintptr // size on 32bit platforms
_64bit uintptr // size on 64bit platforms
}{
- {Symbol{}, 124, 200},
+ {Symbol{}, 120, 192},
}
for _, tt := range tests {
Type SymKind
Version int16
Attr Attribute
- Localentry uint8
Dynid int32
Plt int32
Got int32
extname string
dynimplib string
dynimpvers string
+ localentry uint8
}
func (s *Symbol) String() string {
}
}
+func (s *Symbol) Localentry() uint8 {
+ if s.auxinfo == nil {
+ return 0
+ }
+ return s.auxinfo.localentry
+}
+
+func (s *Symbol) SetLocalentry(val uint8) {
+ if s.auxinfo == nil {
+ if val != 0 {
+ return
+ }
+ s.makeAuxInfo()
+ }
+ s.auxinfo.localentry = val
+}
+
// 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 {