...
Source file src/pkg/cmd/link/internal/sym/reloc.go
1
2
3
4
5 package sym
6
7 import (
8 "cmd/internal/objabi"
9 "cmd/internal/sys"
10 "debug/elf"
11 )
12
13
14
15
16
17
18
19
20
21
22
23
24 type Reloc struct {
25 Off int32
26 Siz uint8
27 Done bool
28 Type objabi.RelocType
29 Add int64
30 Sym *Symbol
31 *relocExt
32 }
33
34
35
36 type relocExt struct {
37 Xadd int64
38 Xsym *Symbol
39 Variant RelocVariant
40 }
41
42 func (r *Reloc) InitExt() {
43 if r.relocExt == nil {
44 r.relocExt = new(relocExt)
45 }
46 }
47
48
49 type RelocVariant uint8
50
51 const (
52 RV_NONE RelocVariant = iota
53 RV_POWER_LO
54 RV_POWER_HI
55 RV_POWER_HA
56 RV_POWER_DS
57
58
59
60
61 RV_390_DBL
62
63 RV_CHECK_OVERFLOW RelocVariant = 1 << 7
64 RV_TYPE_MASK RelocVariant = RV_CHECK_OVERFLOW - 1
65 )
66
67 func RelocName(arch *sys.Arch, r objabi.RelocType) string {
68
69
70
71 switch {
72 case r >= objabi.MachoRelocOffset:
73
74
75
76
77
78
79
80
81
82
83
84
85
86 case r >= objabi.ElfRelocOffset:
87 nr := r - objabi.ElfRelocOffset
88 switch arch.Family {
89 case sys.AMD64:
90 return elf.R_X86_64(nr).String()
91 case sys.ARM:
92 return elf.R_ARM(nr).String()
93 case sys.ARM64:
94 return elf.R_AARCH64(nr).String()
95 case sys.I386:
96 return elf.R_386(nr).String()
97 case sys.MIPS, sys.MIPS64:
98 return elf.R_MIPS(nr).String()
99 case sys.PPC64:
100 return elf.R_PPC64(nr).String()
101 case sys.S390X:
102 return elf.R_390(nr).String()
103 default:
104 panic("unreachable")
105 }
106 }
107
108 return r.String()
109 }
110
111
112 type RelocByOff []Reloc
113
114 func (x RelocByOff) Len() int { return len(x) }
115
116 func (x RelocByOff) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
117
118 func (x RelocByOff) Less(i, j int) bool {
119 a := &x[i]
120 b := &x[j]
121 if a.Off < b.Off {
122 return true
123 }
124 if a.Off > b.Off {
125 return false
126 }
127 return false
128 }
129
View as plain text