...
Source file src/pkg/cmd/link/internal/ld/typelink.go
1
2
3
4
5 package ld
6
7 import (
8 "cmd/internal/objabi"
9 "cmd/link/internal/sym"
10 "sort"
11 )
12
13 type byTypeStr []typelinkSortKey
14
15 type typelinkSortKey struct {
16 TypeStr string
17 Type *sym.Symbol
18 }
19
20 func (s byTypeStr) Less(i, j int) bool { return s[i].TypeStr < s[j].TypeStr }
21 func (s byTypeStr) Len() int { return len(s) }
22 func (s byTypeStr) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
23
24
25
26
27 func (ctxt *Link) typelink() {
28 typelinks := byTypeStr{}
29 for _, s := range ctxt.Syms.Allsym {
30 if s.Attr.Reachable() && s.Attr.MakeTypelink() {
31 typelinks = append(typelinks, typelinkSortKey{decodetypeStr(ctxt.Arch, s), s})
32 }
33 }
34 sort.Sort(typelinks)
35
36 tl := ctxt.Syms.Lookup("runtime.typelink", 0)
37 tl.Type = sym.STYPELINK
38 tl.Attr |= sym.AttrReachable | sym.AttrLocal
39 tl.Size = int64(4 * len(typelinks))
40 tl.P = make([]byte, tl.Size)
41 tl.R = make([]sym.Reloc, len(typelinks))
42 for i, s := range typelinks {
43 r := &tl.R[i]
44 r.Sym = s.Type
45 r.Off = int32(i * 4)
46 r.Siz = 4
47 r.Type = objabi.R_ADDROFF
48 }
49 }
50
View as plain text