]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/x86: align functions with trap instruction
authorIlya Tocar <ilya.tocar@intel.com>
Tue, 20 Oct 2015 11:52:08 +0000 (14:52 +0300)
committerKeith Randall <khr@golang.org>
Tue, 20 Oct 2015 15:48:49 +0000 (15:48 +0000)
Align functions with 0xCC (INT $3) - breakpoint instruction,
instead of 0x00, which can disassemble into valid instruction.

Change-Id: Ieda191886efc4aacb86f58bea1169fd1b3b57636
Reviewed-on: https://go-review.googlesource.com/16102
Run-TryBot: Ilya Tocar <ilya.tocar@intel.com>
Reviewed-by: Gregory Shimansky <gregory.shimansky@intel.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/internal/obj/x86/asm6.go

index f3be6cdfc7f425c24011f40aae242e1dff0af366..8159e5934f316806b5db7dfafac1cd201acad0e2 100644 (file)
@@ -1754,7 +1754,16 @@ func span6(ctxt *obj.Link, s *obj.LSym) {
                c = naclpad(ctxt, s, c, -c&31)
        }
 
-       c += -c & (FuncAlign - 1)
+       // Pad functions with trap instruction, to catch invalid jumps
+       if c&(FuncAlign-1) != 0 {
+               v = -c & (FuncAlign - 1)
+               obj.Symgrow(ctxt, s, int64(c)+int64(v))
+               for i := c; i < c+v; i++ {
+                       // 0xCC is INT $3 - breakpoint instruction
+                       s.P[i] = uint8(0xCC)
+               }
+               c += v
+       }
        s.Size = int64(c)
 
        if false { /* debug['a'] > 1 */