cmd/internal/obj/x86: On amd64, relocation type for and indirect call is pc-relative.

With this change, the code in bug #15609 compiles and runs properly:

0000000000401070 <main.jump>:
  401070:	ff 15 aa 7e 06 00    	callq  *0x67eaa(%rip)        # 468f20 <main.pointer>
  401076:	c3                   	retq

0000000000468f20 g     O .rodata	0000000000000008 main.pointer

Fixes #15609

Change-Id: Iebb4d5a9f9fff335b693f4efcc97882fe04eefd7
Reviewed-on: https://go-review.googlesource.com/22950
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
Wedson Almeida Filho 2016-05-03 00:28:23 +01:00 committed by David Chase
parent d5a8b9f571
commit 13c829e5f6
6 changed files with 47 additions and 1 deletions

View file

@ -3691,7 +3691,11 @@ func doasm(ctxt *obj.Link, p *obj.Prog) {
ctxt.AsmBuf.Put2(byte(op), o.op[z+1])
r = obj.Addrel(ctxt.Cursym)
r.Off = int32(p.Pc + int64(ctxt.AsmBuf.Len()))
r.Type = obj.R_ADDR
if p.Mode == 64 {
r.Type = obj.R_PCREL
} else {
r.Type = obj.R_ADDR
}
r.Siz = 4
r.Add = p.To.Offset
r.Sym = p.To.Sym

View file

@ -0,0 +1,7 @@
// +build !amd64,!386
package main
func jump() {
target()
}

View file

@ -0,0 +1,8 @@
#include "textflag.h"
DATA ·pointer(SB)/4, $·target(SB)
GLOBL ·pointer(SB),RODATA,$4
TEXT ·jump(SB),NOSPLIT,$4
CALL *·pointer(SB)
RET

View file

@ -0,0 +1,8 @@
#include "textflag.h"
DATA ·pointer(SB)/8, $·target(SB)
GLOBL ·pointer(SB),RODATA,$8
TEXT ·jump(SB),NOSPLIT,$8
CALL *·pointer(SB)
RET

View file

@ -0,0 +1,5 @@
// +build amd64 386
package main
func jump()

View file

@ -0,0 +1,14 @@
package main
var called bool
func target() {
called = true
}
func main() {
jump()
if !called {
panic("target not called")
}
}