mirror of
https://github.com/golang/go
synced 2024-11-02 08:01:26 +00:00
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:
parent
d5a8b9f571
commit
13c829e5f6
6 changed files with 47 additions and 1 deletions
|
@ -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
|
||||
|
|
7
test/fixedbugs/issue15609.dir/call.go
Normal file
7
test/fixedbugs/issue15609.dir/call.go
Normal file
|
@ -0,0 +1,7 @@
|
|||
// +build !amd64,!386
|
||||
|
||||
package main
|
||||
|
||||
func jump() {
|
||||
target()
|
||||
}
|
8
test/fixedbugs/issue15609.dir/call_386.s
Normal file
8
test/fixedbugs/issue15609.dir/call_386.s
Normal 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
|
8
test/fixedbugs/issue15609.dir/call_amd64.s
Normal file
8
test/fixedbugs/issue15609.dir/call_amd64.s
Normal 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
|
5
test/fixedbugs/issue15609.dir/call_decl.go
Normal file
5
test/fixedbugs/issue15609.dir/call_decl.go
Normal file
|
@ -0,0 +1,5 @@
|
|||
// +build amd64 386
|
||||
|
||||
package main
|
||||
|
||||
func jump()
|
14
test/fixedbugs/issue15609.dir/main.go
Normal file
14
test/fixedbugs/issue15609.dir/main.go
Normal file
|
@ -0,0 +1,14 @@
|
|||
package main
|
||||
|
||||
var called bool
|
||||
|
||||
func target() {
|
||||
called = true
|
||||
}
|
||||
|
||||
func main() {
|
||||
jump()
|
||||
if !called {
|
||||
panic("target not called")
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue