| // Copyright 2020 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package ld |
| |
| import ( |
| "cmd/link/internal/sym" |
| ) |
| |
| // Temporary dumping around for sym.Symbol version of helper |
| // functions in elf.go, still being used for some archs/oses. |
| // FIXME: get rid of this file when dodata() is completely |
| // converted and the sym.Symbol functions are not needed. |
| |
| func elfsetstring(s *sym.Symbol, str string, off int) { |
| if nelfstr >= len(elfstr) { |
| Errorf(s, "too many elf strings") |
| errorexit() |
| } |
| |
| elfstr[nelfstr].s = str |
| elfstr[nelfstr].off = off |
| nelfstr++ |
| } |
| |
| func elfrelocsect2(ctxt *Link, sect *sym.Section, syms []*sym.Symbol) { |
| // If main section is SHT_NOBITS, nothing to relocate. |
| // Also nothing to relocate in .shstrtab. |
| if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { |
| return |
| } |
| if sect.Name == ".shstrtab" { |
| return |
| } |
| |
| sect.Reloff = uint64(ctxt.Out.Offset()) |
| for i, s := range syms { |
| if !s.Attr.Reachable() { |
| continue |
| } |
| if uint64(s.Value) >= sect.Vaddr { |
| syms = syms[i:] |
| break |
| } |
| } |
| |
| eaddr := int32(sect.Vaddr + sect.Length) |
| for _, s := range syms { |
| if !s.Attr.Reachable() { |
| continue |
| } |
| if s.Value >= int64(eaddr) { |
| break |
| } |
| for ri := range s.R { |
| r := &s.R[ri] |
| if r.Done { |
| continue |
| } |
| if r.Xsym == nil { |
| Errorf(s, "missing xsym in relocation %#v %#v", r.Sym.Name, s) |
| continue |
| } |
| esr := ElfSymForReloc(ctxt, r.Xsym) |
| if esr == 0 { |
| Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Sym.Name, r.Xsym.Name, r.Sym.Type, r.Sym.Type) |
| } |
| if !r.Xsym.Attr.Reachable() { |
| Errorf(s, "unreachable reloc %d (%s) target %v", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Xsym.Name) |
| } |
| if !thearch.Elfreloc1(ctxt, r, int64(uint64(s.Value+int64(r.Off))-sect.Vaddr)) { |
| Errorf(s, "unsupported obj reloc %d (%s)/%d to %s", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Siz, r.Sym.Name) |
| } |
| } |
| } |
| |
| sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff |
| } |