Skip to content

Commit f78cc13

Browse files
committed
cmd/link: move Plt, Got fields in sym.Symbol to cold section
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 <[email protected]>
1 parent 2975914 commit f78cc13

File tree

10 files changed

+100
-68
lines changed

10 files changed

+100
-68
lines changed

src/cmd/link/internal/amd64/asm.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
139139
if targ.Type == sym.SDYNIMPORT {
140140
addpltsym(ctxt, targ)
141141
r.Sym = ctxt.Syms.Lookup(".plt", 0)
142-
r.Add += int64(targ.Plt)
142+
r.Add += int64(targ.Plt())
143143
}
144144

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

170170
case 256 + objabi.RelocType(elf.R_X86_64_64):
@@ -190,7 +190,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
190190
if targ.Type == sym.SDYNIMPORT {
191191
addpltsym(ctxt, targ)
192192
r.Sym = ctxt.Syms.Lookup(".plt", 0)
193-
r.Add = int64(targ.Plt)
193+
r.Add = int64(targ.Plt())
194194
r.Type = objabi.R_PCREL
195195
return true
196196
}
@@ -230,7 +230,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
230230
addgotsym(ctxt, targ)
231231
r.Type = objabi.R_PCREL
232232
r.Sym = ctxt.Syms.Lookup(".got", 0)
233-
r.Add += int64(targ.Got)
233+
r.Add += int64(targ.Got())
234234
return true
235235
}
236236

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

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

268268
r.Sym = ctxt.Syms.Lookup(".got", 0)
269-
r.Add += int64(targ.Got)
269+
r.Add += int64(targ.Got())
270270
return true
271271
}
272272

@@ -567,7 +567,7 @@ func elfsetupplt(ctxt *ld.Link) {
567567
}
568568

569569
func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
570-
if s.Plt >= 0 {
570+
if s.Plt() >= 0 {
571571
return
572572
}
573573

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

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

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

629629
plt.AddUint8(0xff)
630630
plt.AddUint8(0x25)
631-
plt.AddPCRelPlus(ctxt.Arch, ctxt.Syms.Lookup(".got", 0), int64(s.Got))
631+
plt.AddPCRelPlus(ctxt.Arch, ctxt.Syms.Lookup(".got", 0), int64(s.Got()))
632632
} else {
633633
ld.Errorf(s, "addpltsym: unsupported binary format")
634634
}
635635
}
636636

637637
func addgotsym(ctxt *ld.Link, s *sym.Symbol) {
638-
if s.Got >= 0 {
638+
if s.Got() >= 0 {
639639
return
640640
}
641641

642642
ld.Adddynsym(ctxt, s)
643643
got := ctxt.Syms.Lookup(".got", 0)
644-
s.Got = int32(got.Size)
644+
s.SetGot(int32(got.Size))
645645
got.AddUint64(ctxt.Arch, 0)
646646

647647
if ctxt.IsELF {
648648
rela := ctxt.Syms.Lookup(".rela", 0)
649-
rela.AddAddrPlus(ctxt.Arch, got, int64(s.Got))
649+
rela.AddAddrPlus(ctxt.Arch, got, int64(s.Got()))
650650
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_X86_64_GLOB_DAT)))
651651
rela.AddUint64(ctxt.Arch, 0)
652652
} else if ctxt.HeadType == objabi.Hdarwin {

src/cmd/link/internal/arm/asm.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
132132
if targ.Type == sym.SDYNIMPORT {
133133
addpltsym(ctxt, targ)
134134
r.Sym = ctxt.Syms.Lookup(".plt", 0)
135-
r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
135+
r.Add = int64(braddoff(int32(r.Add), targ.Plt()/4))
136136
}
137137

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

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

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

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

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

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

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

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

683683
plt.Attr |= sym.AttrReachable
684684
plt.Size += 4
685685
plt.Grow(plt.Size)
686686
}
687687

688688
func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
689-
if s.Plt >= 0 {
689+
if s.Plt() >= 0 {
690690
return
691691
}
692692

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

703703
// .got entry
704-
s.Got = int32(got.Size)
704+
s.SetGot(int32(got.Size))
705705

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

711711
// .plt entry, this depends on the .got entry
712-
s.Plt = int32(plt.Size)
712+
s.SetPlt(int32(plt.Size))
713713

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

718718
// rel
719-
rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got))
719+
rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got()))
720720

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

727727
func addgotsyminternal(ctxt *ld.Link, s *sym.Symbol) {
728-
if s.Got >= 0 {
728+
if s.Got() >= 0 {
729729
return
730730
}
731731

732732
got := ctxt.Syms.Lookup(".got", 0)
733-
s.Got = int32(got.Size)
733+
s.SetGot(int32(got.Size))
734734

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

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

743743
func addgotsym(ctxt *ld.Link, s *sym.Symbol) {
744-
if s.Got >= 0 {
744+
if s.Got() >= 0 {
745745
return
746746
}
747747

748748
ld.Adddynsym(ctxt, s)
749749
got := ctxt.Syms.Lookup(".got", 0)
750-
s.Got = int32(got.Size)
750+
s.SetGot(int32(got.Size))
751751
got.AddUint32(ctxt.Arch, 0)
752752

753753
if ctxt.IsELF {
754754
rel := ctxt.Syms.Lookup(".rel", 0)
755-
rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got))
755+
rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got()))
756756
rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), uint32(elf.R_ARM_GLOB_DAT)))
757757
} else {
758758
ld.Errorf(s, "addgotsym: unsupported binary format")

src/cmd/link/internal/ld/data.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -546,10 +546,10 @@ func windynrelocsym(ctxt *Link, s *sym.Symbol) {
546546
}
547547
Errorf(s, "dynamic relocation to unreachable symbol %s", targ.Name)
548548
}
549-
if r.Sym.Plt == -2 && r.Sym.Got != -2 { // make dynimport JMP table for PE object files.
550-
targ.Plt = int32(rel.Size)
549+
if r.Sym.Plt() == -2 && r.Sym.Got() != -2 { // make dynimport JMP table for PE object files.
550+
targ.SetPlt(int32(rel.Size))
551551
r.Sym = rel
552-
r.Add = int64(targ.Plt)
552+
r.Add = int64(targ.Plt())
553553

554554
// jmp *addr
555555
switch ctxt.Arch.Family {
@@ -569,9 +569,9 @@ func windynrelocsym(ctxt *Link, s *sym.Symbol) {
569569
rel.AddAddrPlus4(targ, 0)
570570
rel.AddUint8(0x90)
571571
}
572-
} else if r.Sym.Plt >= 0 {
572+
} else if r.Sym.Plt() >= 0 {
573573
r.Sym = rel
574-
r.Add = int64(targ.Plt)
574+
r.Add = int64(targ.Plt())
575575
}
576576
}
577577
}

src/cmd/link/internal/loadpe/ldpe.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, input *bio.Reader, pkg string, leng
358358

359359
if pesym.SectionNumber == 0 { // extern
360360
if s.Type == sym.SDYNIMPORT {
361-
s.Plt = -2 // flag for dynimport in PE object files.
361+
s.SetPlt(-2) // flag for dynimport in PE object files.
362362
}
363363
if s.Type == sym.SXREF && pesym.Value > 0 { // global data
364364
s.Type = sym.SNOPTRDATA
@@ -479,7 +479,7 @@ func readpesym(arch *sys.Arch, syms *sym.Symbols, f *pe.File, pesym *pe.COFFSymb
479479
s.Type = sym.SXREF
480480
}
481481
if strings.HasPrefix(symname, "__imp_") {
482-
s.Got = -2 // flag for __imp_
482+
s.SetGot(-2) // flag for __imp_
483483
}
484484

485485
return s, nil

src/cmd/link/internal/ppc64/asm.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ func gencallstub(ctxt *ld.Link, abicase int, stub *sym.Symbol, targ *sym.Symbol)
236236

237237
r.Off = int32(stub.Size)
238238
r.Sym = plt
239-
r.Add = int64(targ.Plt)
239+
r.Add = int64(targ.Plt())
240240
r.Siz = 2
241241
if ctxt.Arch.ByteOrder == binary.BigEndian {
242242
r.Off += int32(r.Siz)
@@ -247,7 +247,7 @@ func gencallstub(ctxt *ld.Link, abicase int, stub *sym.Symbol, targ *sym.Symbol)
247247
r = stub.AddRel()
248248
r.Off = int32(stub.Size)
249249
r.Sym = plt
250-
r.Add = int64(targ.Plt)
250+
r.Add = int64(targ.Plt())
251251
r.Siz = 2
252252
if ctxt.Arch.ByteOrder == binary.BigEndian {
253253
r.Off += int32(r.Siz)
@@ -793,7 +793,7 @@ overflow:
793793
}
794794

795795
func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
796-
if s.Plt >= 0 {
796+
if s.Plt() >= 0 {
797797
return
798798
}
799799

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

830830
plt.Size += 8
831831

832-
rela.AddAddrPlus(ctxt.Arch, plt, int64(s.Plt))
832+
rela.AddAddrPlus(ctxt.Arch, plt, int64(s.Plt()))
833833
rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_PPC64_JMP_SLOT)))
834834
rela.AddUint64(ctxt.Arch, 0)
835835
} else {

0 commit comments

Comments
 (0)