]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/x86: On amd64, relocation type for and indirect call is pc-relative.
authorWedson Almeida Filho <wedsonaf@google.com>
Mon, 2 May 2016 23:28:23 +0000 (00:28 +0100)
committerDavid Chase <drchase@google.com>
Sun, 9 Oct 2016 19:50:09 +0000 (19:50 +0000)
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>
src/cmd/internal/obj/x86/asm6.go
test/fixedbugs/issue15609.dir/call.go [new file with mode: 0644]
test/fixedbugs/issue15609.dir/call_386.s [new file with mode: 0644]
test/fixedbugs/issue15609.dir/call_amd64.s [new file with mode: 0644]
test/fixedbugs/issue15609.dir/call_decl.go [new file with mode: 0644]
test/fixedbugs/issue15609.dir/main.go [new file with mode: 0644]

index c023775f90c5ed6825db46efb94a8e82f490e10b..7efc30e03c2381e974d17db7f336b55e51023768 100644 (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
diff --git a/test/fixedbugs/issue15609.dir/call.go b/test/fixedbugs/issue15609.dir/call.go
new file mode 100644 (file)
index 0000000..41a489c
--- /dev/null
@@ -0,0 +1,7 @@
+// +build !amd64,!386
+
+package main
+
+func jump() {
+       target()
+}
diff --git a/test/fixedbugs/issue15609.dir/call_386.s b/test/fixedbugs/issue15609.dir/call_386.s
new file mode 100644 (file)
index 0000000..751084c
--- /dev/null
@@ -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
diff --git a/test/fixedbugs/issue15609.dir/call_amd64.s b/test/fixedbugs/issue15609.dir/call_amd64.s
new file mode 100644 (file)
index 0000000..09fbe5d
--- /dev/null
@@ -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
diff --git a/test/fixedbugs/issue15609.dir/call_decl.go b/test/fixedbugs/issue15609.dir/call_decl.go
new file mode 100644 (file)
index 0000000..d9c5a4e
--- /dev/null
@@ -0,0 +1,5 @@
+// +build amd64 386
+
+package main
+
+func jump()
diff --git a/test/fixedbugs/issue15609.dir/main.go b/test/fixedbugs/issue15609.dir/main.go
new file mode 100644 (file)
index 0000000..4855e31
--- /dev/null
@@ -0,0 +1,14 @@
+package main
+
+var called bool
+
+func target() {
+       called = true
+}
+
+func main() {
+       jump()
+       if !called {
+               panic("target not called")
+       }
+}