Skip to content

Commit

Permalink
cmd/link: move Plt, Got fields in sym.Symbol to cold section
Browse files Browse the repository at this point in the history
The sym.Symbol 'Plt' and 'Got' field are used only with cgo and/or
external linking and are not needed for most symbols. Relocate them to
sym.AuxSymbol so as to shrink the main Symbol struct.

Updates #26186

Change-Id: I170d628a760be300a0c1f738f0998970e91ce3d6
Reviewed-on: https://go-review.googlesource.com/125478
Reviewed-by: Ian Lance Taylor <iant@golang.org>
  • Loading branch information
thanm committed Aug 30, 2018
1 parent 2975914 commit f78cc13
Show file tree
Hide file tree
Showing 10 changed files with 100 additions and 68 deletions.
28 changes: 14 additions & 14 deletions src/cmd/link/internal/amd64/asm.go
Expand Up @@ -139,7 +139,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
if targ.Type == sym.SDYNIMPORT {
addpltsym(ctxt, targ)
r.Sym = ctxt.Syms.Lookup(".plt", 0)
r.Add += int64(targ.Plt)
r.Add += int64(targ.Plt())
}

return true
Expand All @@ -164,7 +164,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
r.Type = objabi.R_PCREL
r.Sym = ctxt.Syms.Lookup(".got", 0)
r.Add += 4
r.Add += int64(targ.Got)
r.Add += int64(targ.Got())
return true

case 256 + objabi.RelocType(elf.R_X86_64_64):
Expand All @@ -190,7 +190,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
if targ.Type == sym.SDYNIMPORT {
addpltsym(ctxt, targ)
r.Sym = ctxt.Syms.Lookup(".plt", 0)
r.Add = int64(targ.Plt)
r.Add = int64(targ.Plt())
r.Type = objabi.R_PCREL
return true
}
Expand Down Expand Up @@ -230,7 +230,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
addgotsym(ctxt, targ)
r.Type = objabi.R_PCREL
r.Sym = ctxt.Syms.Lookup(".got", 0)
r.Add += int64(targ.Got)
r.Add += int64(targ.Got())
return true
}

Expand All @@ -249,15 +249,15 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
// Build a PLT entry and change the relocation target to that entry.
addpltsym(ctxt, targ)
r.Sym = ctxt.Syms.Lookup(".plt", 0)
r.Add = int64(targ.Plt)
r.Add = int64(targ.Plt())
return true

case objabi.R_ADDR:
if s.Type == sym.STEXT && ctxt.IsELF {
if ctxt.HeadType == objabi.Hsolaris {
addpltsym(ctxt, targ)
r.Sym = ctxt.Syms.Lookup(".plt", 0)
r.Add += int64(targ.Plt)
r.Add += int64(targ.Plt())
return true
}
// The code is asking for the address of an external
Expand All @@ -266,7 +266,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
addgotsym(ctxt, targ)

r.Sym = ctxt.Syms.Lookup(".got", 0)
r.Add += int64(targ.Got)
r.Add += int64(targ.Got())
return true
}

Expand Down Expand Up @@ -567,7 +567,7 @@ func elfsetupplt(ctxt *ld.Link) {
}

func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
if s.Plt >= 0 {
if s.Plt() >= 0 {
return
}

Expand Down Expand Up @@ -606,7 +606,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_X86_64_JMP_SLOT)))
rela.AddUint64(ctxt.Arch, 0)

s.Plt = int32(plt.Size - 16)
s.SetPlt(int32(plt.Size - 16))
} else if ctxt.HeadType == objabi.Hdarwin {
// To do lazy symbol lookup right, we're supposed
// to tell the dynamic loader which library each
Expand All @@ -624,29 +624,29 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
ctxt.Syms.Lookup(".linkedit.plt", 0).AddUint32(ctxt.Arch, uint32(s.Dynid))

// jmpq *got+size(IP)
s.Plt = int32(plt.Size)
s.SetPlt(int32(plt.Size))

plt.AddUint8(0xff)
plt.AddUint8(0x25)
plt.AddPCRelPlus(ctxt.Arch, ctxt.Syms.Lookup(".got", 0), int64(s.Got))
plt.AddPCRelPlus(ctxt.Arch, ctxt.Syms.Lookup(".got", 0), int64(s.Got()))
} else {
ld.Errorf(s, "addpltsym: unsupported binary format")
}
}

func addgotsym(ctxt *ld.Link, s *sym.Symbol) {
if s.Got >= 0 {
if s.Got() >= 0 {
return
}

ld.Adddynsym(ctxt, s)
got := ctxt.Syms.Lookup(".got", 0)
s.Got = int32(got.Size)
s.SetGot(int32(got.Size))
got.AddUint64(ctxt.Arch, 0)

if ctxt.IsELF {
rela := ctxt.Syms.Lookup(".rela", 0)
rela.AddAddrPlus(ctxt.Arch, got, int64(s.Got))
rela.AddAddrPlus(ctxt.Arch, got, int64(s.Got()))
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_X86_64_GLOB_DAT)))
rela.AddUint64(ctxt.Arch, 0)
} else if ctxt.HeadType == objabi.Hdarwin {
Expand Down
32 changes: 16 additions & 16 deletions src/cmd/link/internal/arm/asm.go
Expand Up @@ -132,7 +132,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
if targ.Type == sym.SDYNIMPORT {
addpltsym(ctxt, targ)
r.Sym = ctxt.Syms.Lookup(".plt", 0)
r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
r.Add = int64(braddoff(int32(r.Add), targ.Plt()/4))
}

return true
Expand All @@ -150,7 +150,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {

r.Type = objabi.R_CONST // write r->add during relocsym
r.Sym = nil
r.Add += int64(targ.Got)
r.Add += int64(targ.Got())
return true

case 256 + objabi.RelocType(elf.R_ARM_GOT_PREL): // GOT(nil) + A - nil
Expand All @@ -162,7 +162,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {

r.Type = objabi.R_PCREL
r.Sym = ctxt.Syms.Lookup(".got", 0)
r.Add += int64(targ.Got) + 4
r.Add += int64(targ.Got()) + 4
return true

case 256 + objabi.RelocType(elf.R_ARM_GOTOFF): // R_ARM_GOTOFF32
Expand All @@ -182,7 +182,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
if targ.Type == sym.SDYNIMPORT {
addpltsym(ctxt, targ)
r.Sym = ctxt.Syms.Lookup(".plt", 0)
r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
r.Add = int64(braddoff(int32(r.Add), targ.Plt()/4))
}

return true
Expand Down Expand Up @@ -216,7 +216,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
if targ.Type == sym.SDYNIMPORT {
addpltsym(ctxt, targ)
r.Sym = ctxt.Syms.Lookup(".plt", 0)
r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
r.Add = int64(braddoff(int32(r.Add), targ.Plt()/4))
}

return true
Expand All @@ -235,7 +235,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
}
addpltsym(ctxt, targ)
r.Sym = ctxt.Syms.Lookup(".plt", 0)
r.Add = int64(targ.Plt)
r.Add = int64(targ.Plt())
return true

case objabi.R_ADDR:
Expand Down Expand Up @@ -678,15 +678,15 @@ func addpltreloc(ctxt *ld.Link, plt *sym.Symbol, got *sym.Symbol, s *sym.Symbol,
r.Off = int32(plt.Size)
r.Siz = 4
r.Type = typ
r.Add = int64(s.Got) - 8
r.Add = int64(s.Got()) - 8

plt.Attr |= sym.AttrReachable
plt.Size += 4
plt.Grow(plt.Size)
}

func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
if s.Plt >= 0 {
if s.Plt() >= 0 {
return
}

Expand All @@ -701,22 +701,22 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
}

// .got entry
s.Got = int32(got.Size)
s.SetGot(int32(got.Size))

// In theory, all GOT should point to the first PLT entry,
// Linux/ARM's dynamic linker will do that for us, but FreeBSD/ARM's
// dynamic linker won't, so we'd better do it ourselves.
got.AddAddrPlus(ctxt.Arch, plt, 0)

// .plt entry, this depends on the .got entry
s.Plt = int32(plt.Size)
s.SetPlt(int32(plt.Size))

addpltreloc(ctxt, plt, got, s, objabi.R_PLT0) // add lr, pc, #0xXX00000
addpltreloc(ctxt, plt, got, s, objabi.R_PLT1) // add lr, lr, #0xYY000
addpltreloc(ctxt, plt, got, s, objabi.R_PLT2) // ldr pc, [lr, #0xZZZ]!

// rel
rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got))
rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got()))

rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), uint32(elf.R_ARM_JUMP_SLOT)))
} else {
Expand All @@ -725,12 +725,12 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
}

func addgotsyminternal(ctxt *ld.Link, s *sym.Symbol) {
if s.Got >= 0 {
if s.Got() >= 0 {
return
}

got := ctxt.Syms.Lookup(".got", 0)
s.Got = int32(got.Size)
s.SetGot(int32(got.Size))

got.AddAddrPlus(ctxt.Arch, s, 0)

Expand All @@ -741,18 +741,18 @@ func addgotsyminternal(ctxt *ld.Link, s *sym.Symbol) {
}

func addgotsym(ctxt *ld.Link, s *sym.Symbol) {
if s.Got >= 0 {
if s.Got() >= 0 {
return
}

ld.Adddynsym(ctxt, s)
got := ctxt.Syms.Lookup(".got", 0)
s.Got = int32(got.Size)
s.SetGot(int32(got.Size))
got.AddUint32(ctxt.Arch, 0)

if ctxt.IsELF {
rel := ctxt.Syms.Lookup(".rel", 0)
rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got))
rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got()))
rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), uint32(elf.R_ARM_GLOB_DAT)))
} else {
ld.Errorf(s, "addgotsym: unsupported binary format")
Expand Down
10 changes: 5 additions & 5 deletions src/cmd/link/internal/ld/data.go
Expand Up @@ -546,10 +546,10 @@ func windynrelocsym(ctxt *Link, s *sym.Symbol) {
}
Errorf(s, "dynamic relocation to unreachable symbol %s", targ.Name)
}
if r.Sym.Plt == -2 && r.Sym.Got != -2 { // make dynimport JMP table for PE object files.
targ.Plt = int32(rel.Size)
if r.Sym.Plt() == -2 && r.Sym.Got() != -2 { // make dynimport JMP table for PE object files.
targ.SetPlt(int32(rel.Size))
r.Sym = rel
r.Add = int64(targ.Plt)
r.Add = int64(targ.Plt())

// jmp *addr
switch ctxt.Arch.Family {
Expand All @@ -569,9 +569,9 @@ func windynrelocsym(ctxt *Link, s *sym.Symbol) {
rel.AddAddrPlus4(targ, 0)
rel.AddUint8(0x90)
}
} else if r.Sym.Plt >= 0 {
} else if r.Sym.Plt() >= 0 {
r.Sym = rel
r.Add = int64(targ.Plt)
r.Add = int64(targ.Plt())
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/cmd/link/internal/loadpe/ldpe.go
Expand Up @@ -358,7 +358,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, input *bio.Reader, pkg string, leng

if pesym.SectionNumber == 0 { // extern
if s.Type == sym.SDYNIMPORT {
s.Plt = -2 // flag for dynimport in PE object files.
s.SetPlt(-2) // flag for dynimport in PE object files.
}
if s.Type == sym.SXREF && pesym.Value > 0 { // global data
s.Type = sym.SNOPTRDATA
Expand Down Expand Up @@ -479,7 +479,7 @@ func readpesym(arch *sys.Arch, syms *sym.Symbols, f *pe.File, pesym *pe.COFFSymb
s.Type = sym.SXREF
}
if strings.HasPrefix(symname, "__imp_") {
s.Got = -2 // flag for __imp_
s.SetGot(-2) // flag for __imp_
}

return s, nil
Expand Down
10 changes: 5 additions & 5 deletions src/cmd/link/internal/ppc64/asm.go
Expand Up @@ -236,7 +236,7 @@ func gencallstub(ctxt *ld.Link, abicase int, stub *sym.Symbol, targ *sym.Symbol)

r.Off = int32(stub.Size)
r.Sym = plt
r.Add = int64(targ.Plt)
r.Add = int64(targ.Plt())
r.Siz = 2
if ctxt.Arch.ByteOrder == binary.BigEndian {
r.Off += int32(r.Siz)
Expand All @@ -247,7 +247,7 @@ func gencallstub(ctxt *ld.Link, abicase int, stub *sym.Symbol, targ *sym.Symbol)
r = stub.AddRel()
r.Off = int32(stub.Size)
r.Sym = plt
r.Add = int64(targ.Plt)
r.Add = int64(targ.Plt())
r.Siz = 2
if ctxt.Arch.ByteOrder == binary.BigEndian {
r.Off += int32(r.Siz)
Expand Down Expand Up @@ -793,7 +793,7 @@ overflow:
}

func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
if s.Plt >= 0 {
if s.Plt() >= 0 {
return
}

Expand Down Expand Up @@ -825,11 +825,11 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
// JMP_SLOT dynamic relocation for it.
//
// TODO(austin): ABI v1 is different
s.Plt = int32(plt.Size)
s.SetPlt(int32(plt.Size))

plt.Size += 8

rela.AddAddrPlus(ctxt.Arch, plt, int64(s.Plt))
rela.AddAddrPlus(ctxt.Arch, plt, int64(s.Plt()))
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_PPC64_JMP_SLOT)))
rela.AddUint64(ctxt.Arch, 0)
} else {
Expand Down

0 comments on commit f78cc13

Please sign in to comment.