Skip to content

Commit 914db9f

Browse files
cmd/link: support new 386/amd64 relocations
The GNU binutils recently picked up support for new 386/amd64 relocations. Add support for them in the Go linker when doing an internal link. The 386 relocation R_386_GOT32X was proposed in https://groups.google.com/forum/#!topic/ia32-abi/GbJJskkid4I . It can be treated as identical to the R_386_GOT32 relocation. The amd64 relocations R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX were proposed in https://groups.google.com/forum/#!topic/x86-64-abi/n9AWHogmVY0 . They can both be treated as identical to the R_X86_64_GOTPCREL relocation. The purpose of the new relocations is to permit additional linker relaxations in some cases. We do not attempt to support those cases. While we're at it, remove the unused and in some cases out of date _COUNT names from ld/elf.go. Fixes #13114. Change-Id: I34ef07f6fcd00cdd2996038ecf46bb77a49e968b Reviewed-on: https://go-review.googlesource.com/16529 Reviewed-by: Minux Ma <minux@golang.org>
1 parent ce30458 commit 914db9f

File tree

4 files changed

+83
-64
lines changed

4 files changed

+83
-64
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
139139

140140
return
141141

142-
case 256 + ld.R_X86_64_GOTPCREL:
142+
case 256 + ld.R_X86_64_GOTPCREL, 256 + ld.R_X86_64_GOTPCRELX, 256 + ld.R_X86_64_REX_GOTPCRELX:
143143
if targ.Type != obj.SDYNIMPORT {
144144
// have symbol
145145
if r.Off >= 2 && s.P[r.Off-2] == 0x8b {

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

Lines changed: 78 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -325,31 +325,47 @@ const (
325325
* Relocation types.
326326
*/
327327
const (
328-
R_X86_64_NONE = 0
329-
R_X86_64_64 = 1
330-
R_X86_64_PC32 = 2
331-
R_X86_64_GOT32 = 3
332-
R_X86_64_PLT32 = 4
333-
R_X86_64_COPY = 5
334-
R_X86_64_GLOB_DAT = 6
335-
R_X86_64_JMP_SLOT = 7
336-
R_X86_64_RELATIVE = 8
337-
R_X86_64_GOTPCREL = 9
338-
R_X86_64_32 = 10
339-
R_X86_64_32S = 11
340-
R_X86_64_16 = 12
341-
R_X86_64_PC16 = 13
342-
R_X86_64_8 = 14
343-
R_X86_64_PC8 = 15
344-
R_X86_64_DTPMOD64 = 16
345-
R_X86_64_DTPOFF64 = 17
346-
R_X86_64_TPOFF64 = 18
347-
R_X86_64_TLSGD = 19
348-
R_X86_64_TLSLD = 20
349-
R_X86_64_DTPOFF32 = 21
350-
R_X86_64_GOTTPOFF = 22
351-
R_X86_64_TPOFF32 = 23
352-
R_X86_64_COUNT = 24
328+
R_X86_64_NONE = 0
329+
R_X86_64_64 = 1
330+
R_X86_64_PC32 = 2
331+
R_X86_64_GOT32 = 3
332+
R_X86_64_PLT32 = 4
333+
R_X86_64_COPY = 5
334+
R_X86_64_GLOB_DAT = 6
335+
R_X86_64_JMP_SLOT = 7
336+
R_X86_64_RELATIVE = 8
337+
R_X86_64_GOTPCREL = 9
338+
R_X86_64_32 = 10
339+
R_X86_64_32S = 11
340+
R_X86_64_16 = 12
341+
R_X86_64_PC16 = 13
342+
R_X86_64_8 = 14
343+
R_X86_64_PC8 = 15
344+
R_X86_64_DTPMOD64 = 16
345+
R_X86_64_DTPOFF64 = 17
346+
R_X86_64_TPOFF64 = 18
347+
R_X86_64_TLSGD = 19
348+
R_X86_64_TLSLD = 20
349+
R_X86_64_DTPOFF32 = 21
350+
R_X86_64_GOTTPOFF = 22
351+
R_X86_64_TPOFF32 = 23
352+
R_X86_64_PC64 = 24
353+
R_X86_64_GOTOFF64 = 25
354+
R_X86_64_GOTPC32 = 26
355+
R_X86_64_GOT64 = 27
356+
R_X86_64_GOTPCREL64 = 28
357+
R_X86_64_GOTPC64 = 29
358+
R_X86_64_GOTPLT64 = 30
359+
R_X86_64_PLTOFF64 = 31
360+
R_X86_64_SIZE32 = 32
361+
R_X86_64_SIZE64 = 33
362+
R_X86_64_GOTPC32_TLSDEC = 34
363+
R_X86_64_TLSDESC_CALL = 35
364+
R_X86_64_TLSDESC = 36
365+
R_X86_64_IRELATIVE = 37
366+
R_X86_64_PC32_BND = 40
367+
R_X86_64_GOTPCRELX = 41
368+
R_X86_64_REX_GOTPCRELX = 42
353369

354370
R_AARCH64_ABS64 = 257
355371
R_AARCH64_ABS32 = 258
@@ -388,7 +404,6 @@ const (
388404
R_ALPHA_GLOB_DAT = 25
389405
R_ALPHA_JMP_SLOT = 26
390406
R_ALPHA_RELATIVE = 27
391-
R_ALPHA_COUNT = 28
392407

393408
R_ARM_NONE = 0
394409
R_ARM_PC24 = 1
@@ -429,40 +444,43 @@ const (
429444
R_ARM_RABS32 = 253
430445
R_ARM_RPC24 = 254
431446
R_ARM_RBASE = 255
432-
R_ARM_COUNT = 38
433-
434-
R_386_NONE = 0
435-
R_386_32 = 1
436-
R_386_PC32 = 2
437-
R_386_GOT32 = 3
438-
R_386_PLT32 = 4
439-
R_386_COPY = 5
440-
R_386_GLOB_DAT = 6
441-
R_386_JMP_SLOT = 7
442-
R_386_RELATIVE = 8
443-
R_386_GOTOFF = 9
444-
R_386_GOTPC = 10
445-
R_386_TLS_TPOFF = 14
446-
R_386_TLS_IE = 15
447-
R_386_TLS_GOTIE = 16
448-
R_386_TLS_LE = 17
449-
R_386_TLS_GD = 18
450-
R_386_TLS_LDM = 19
451-
R_386_TLS_GD_32 = 24
452-
R_386_TLS_GD_PUSH = 25
453-
R_386_TLS_GD_CALL = 26
454-
R_386_TLS_GD_POP = 27
455-
R_386_TLS_LDM_32 = 28
456-
R_386_TLS_LDM_PUSH = 29
457-
R_386_TLS_LDM_CALL = 30
458-
R_386_TLS_LDM_POP = 31
459-
R_386_TLS_LDO_32 = 32
460-
R_386_TLS_IE_32 = 33
461-
R_386_TLS_LE_32 = 34
462-
R_386_TLS_DTPMOD32 = 35
463-
R_386_TLS_DTPOFF32 = 36
464-
R_386_TLS_TPOFF32 = 37
465-
R_386_COUNT = 38
447+
448+
R_386_NONE = 0
449+
R_386_32 = 1
450+
R_386_PC32 = 2
451+
R_386_GOT32 = 3
452+
R_386_PLT32 = 4
453+
R_386_COPY = 5
454+
R_386_GLOB_DAT = 6
455+
R_386_JMP_SLOT = 7
456+
R_386_RELATIVE = 8
457+
R_386_GOTOFF = 9
458+
R_386_GOTPC = 10
459+
R_386_TLS_TPOFF = 14
460+
R_386_TLS_IE = 15
461+
R_386_TLS_GOTIE = 16
462+
R_386_TLS_LE = 17
463+
R_386_TLS_GD = 18
464+
R_386_TLS_LDM = 19
465+
R_386_TLS_GD_32 = 24
466+
R_386_TLS_GD_PUSH = 25
467+
R_386_TLS_GD_CALL = 26
468+
R_386_TLS_GD_POP = 27
469+
R_386_TLS_LDM_32 = 28
470+
R_386_TLS_LDM_PUSH = 29
471+
R_386_TLS_LDM_CALL = 30
472+
R_386_TLS_LDM_POP = 31
473+
R_386_TLS_LDO_32 = 32
474+
R_386_TLS_IE_32 = 33
475+
R_386_TLS_LE_32 = 34
476+
R_386_TLS_DTPMOD32 = 35
477+
R_386_TLS_DTPOFF32 = 36
478+
R_386_TLS_TPOFF32 = 37
479+
R_386_TLS_GOTDESC = 39
480+
R_386_TLS_DESC_CALL = 40
481+
R_386_TLS_DESC = 41
482+
R_386_IRELATIVE = 42
483+
R_386_GOT32X = 43
466484

467485
R_PPC_NONE = 0
468486
R_PPC_ADDR32 = 1
@@ -501,7 +519,6 @@ const (
501519
R_PPC_SECTOFF_LO = 34
502520
R_PPC_SECTOFF_HI = 35
503521
R_PPC_SECTOFF_HA = 36
504-
R_PPC_COUNT = 37
505522
R_PPC_TLS = 67
506523
R_PPC_DTPMOD32 = 68
507524
R_PPC_TPREL16 = 69
@@ -542,7 +559,6 @@ const (
542559
R_PPC_EMB_RELST_HA = 114
543560
R_PPC_EMB_BIT_FLD = 115
544561
R_PPC_EMB_RELSDA = 116
545-
R_PPC_EMB_COUNT = R_PPC_EMB_RELSDA - R_PPC_EMB_NADDR32 + 1
546562

547563
R_PPC64_REL24 = R_PPC_REL24
548564
R_PPC64_JMP_SLOT = R_PPC_JMP_SLOT

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,12 +1137,15 @@ func reltype(pn string, elftype int, siz *uint8) int {
11371137
'6' | R_X86_64_PC32<<24,
11381138
'6' | R_X86_64_PLT32<<24,
11391139
'6' | R_X86_64_GOTPCREL<<24,
1140+
'6' | R_X86_64_GOTPCRELX<<24,
1141+
'6' | R_X86_64_REX_GOTPCRELX<<24,
11401142
'8' | R_386_32<<24,
11411143
'8' | R_386_PC32<<24,
11421144
'8' | R_386_GOT32<<24,
11431145
'8' | R_386_PLT32<<24,
11441146
'8' | R_386_GOTOFF<<24,
11451147
'8' | R_386_GOTPC<<24,
1148+
'8' | R_386_GOT32X<<24,
11461149
'9' | R_PPC64_REL24<<24:
11471150
*siz = 4
11481151

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
7878

7979
return
8080

81-
case 256 + ld.R_386_GOT32:
81+
case 256 + ld.R_386_GOT32, 256 + ld.R_386_GOT32X:
8282
if targ.Type != obj.SDYNIMPORT {
8383
// have symbol
8484
if r.Off >= 2 && s.P[r.Off-2] == 0x8b {

0 commit comments

Comments
 (0)