mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/5l, etc, cmd/internal/ld: consolidate implementations of adddynsym
The only essential difference is elf32 vs elf64, I assume the other differences are bugs in one version or another... Change-Id: Ie6ff33d5574a6592b543df9983eff8fdf88c97a1 Reviewed-on: https://go-review.googlesource.com/10001 Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com> Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
004706099d
commit
4cfff271c2
13 changed files with 120 additions and 231 deletions
|
|
@ -274,7 +274,7 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
|
|||
break
|
||||
}
|
||||
if ld.Iself {
|
||||
adddynsym(ld.Ctxt, targ)
|
||||
ld.Adddynsym(ld.Ctxt, targ)
|
||||
rela := ld.Linklookup(ld.Ctxt, ".rela", 0)
|
||||
ld.Addaddrplus(ld.Ctxt, rela, s, int64(r.Off))
|
||||
if r.Siz == 8 {
|
||||
|
|
@ -298,7 +298,7 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
|
|||
// just in case the C code assigns to the variable,
|
||||
// and of course it only works for single pointers,
|
||||
// but we only need to support cgo and that's all it needs.
|
||||
adddynsym(ld.Ctxt, targ)
|
||||
ld.Adddynsym(ld.Ctxt, targ)
|
||||
|
||||
got := ld.Linklookup(ld.Ctxt, ".got", 0)
|
||||
s.Type = got.Type | obj.SSUB
|
||||
|
|
@ -526,7 +526,7 @@ func addpltsym(s *ld.LSym) {
|
|||
return
|
||||
}
|
||||
|
||||
adddynsym(ld.Ctxt, s)
|
||||
ld.Adddynsym(ld.Ctxt, s)
|
||||
|
||||
if ld.Iself {
|
||||
plt := ld.Linklookup(ld.Ctxt, ".plt", 0)
|
||||
|
|
@ -594,7 +594,7 @@ func addgotsym(s *ld.LSym) {
|
|||
return
|
||||
}
|
||||
|
||||
adddynsym(ld.Ctxt, s)
|
||||
ld.Adddynsym(ld.Ctxt, s)
|
||||
got := ld.Linklookup(ld.Ctxt, ".got", 0)
|
||||
s.Got = int32(got.Size)
|
||||
ld.Adduint64(ld.Ctxt, got, 0)
|
||||
|
|
@ -611,62 +611,6 @@ func addgotsym(s *ld.LSym) {
|
|||
}
|
||||
}
|
||||
|
||||
func adddynsym(ctxt *ld.Link, s *ld.LSym) {
|
||||
if s.Dynid >= 0 {
|
||||
return
|
||||
}
|
||||
|
||||
if ld.Iself {
|
||||
s.Dynid = int32(ld.Nelfsym)
|
||||
ld.Nelfsym++
|
||||
|
||||
d := ld.Linklookup(ctxt, ".dynsym", 0)
|
||||
|
||||
name := s.Extname
|
||||
ld.Adduint32(ctxt, d, uint32(ld.Addstring(ld.Linklookup(ctxt, ".dynstr", 0), name)))
|
||||
|
||||
/* type */
|
||||
t := ld.STB_GLOBAL << 4
|
||||
|
||||
if s.Cgoexport != 0 && s.Type&obj.SMASK == obj.STEXT {
|
||||
t |= ld.STT_FUNC
|
||||
} else {
|
||||
t |= ld.STT_OBJECT
|
||||
}
|
||||
ld.Adduint8(ctxt, d, uint8(t))
|
||||
|
||||
/* reserved */
|
||||
ld.Adduint8(ctxt, d, 0)
|
||||
|
||||
/* section where symbol is defined */
|
||||
if s.Type == obj.SDYNIMPORT {
|
||||
ld.Adduint16(ctxt, d, ld.SHN_UNDEF)
|
||||
} else {
|
||||
ld.Adduint16(ctxt, d, 1)
|
||||
}
|
||||
|
||||
/* value */
|
||||
if s.Type == obj.SDYNIMPORT {
|
||||
ld.Adduint64(ctxt, d, 0)
|
||||
} else {
|
||||
ld.Addaddr(ctxt, d, s)
|
||||
}
|
||||
|
||||
/* size of object */
|
||||
ld.Adduint64(ctxt, d, uint64(s.Size))
|
||||
|
||||
if s.Cgoexport&ld.CgoExportDynamic == 0 && s.Dynimplib != "" && !ld.Seenlib[s.Dynimplib] {
|
||||
ld.Elfwritedynent(ld.Linklookup(ctxt, ".dynamic", 0), ld.DT_NEEDED, uint64(ld.Addstring(ld.Linklookup(ctxt, ".dynstr", 0), s.Dynimplib)))
|
||||
}
|
||||
} else if ld.HEADTYPE == obj.Hdarwin {
|
||||
ld.Diag("adddynsym: missed symbol %s (%s)", s.Name, s.Extname)
|
||||
} else if ld.HEADTYPE == obj.Hwindows {
|
||||
} else // already taken care of
|
||||
{
|
||||
ld.Diag("adddynsym: unsupported binary format")
|
||||
}
|
||||
}
|
||||
|
||||
func asmb() {
|
||||
if ld.Debug['v'] != 0 {
|
||||
fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue