aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/ld
diff options
context:
space:
mode:
authorCarl Shapiro <cshapiro@google.com>2013-03-28 14:36:23 -0700
committerCarl Shapiro <cshapiro@google.com>2013-03-28 14:36:23 -0700
commitc676b8b27b128e6369da7c3a3f2bbf52bde945c8 (patch)
tree6f6ae22ad4df8f416cd4055f9662c335e96f5f4e /src/cmd/ld
parent7e7f89933b9d6eba5d298d3f619b5ef4166e5052 (diff)
downloadgo-c676b8b27b128e6369da7c3a3f2bbf52bde945c8.tar.xz
cmd/ld, runtime: restrict stack root scan to locals and arguments
Updates #5134 R=golang-dev, bradfitz, cshapiro, daniel.morsing, ality, iant CC=golang-dev https://golang.org/cl/8022044
Diffstat (limited to 'src/cmd/ld')
-rw-r--r--src/cmd/ld/lib.c5
-rw-r--r--src/cmd/ld/lib.h7
2 files changed, 11 insertions, 1 deletions
diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c
index aa0360bea6..1bd2d4ff88 100644
--- a/src/cmd/ld/lib.c
+++ b/src/cmd/ld/lib.c
@@ -1862,7 +1862,10 @@ genasmsym(void (*put)(Sym*, char*, int, vlong, vlong, int, Sym*))
/* frame, locals, args, auto and param after */
put(nil, ".frame", 'm', (uint32)s->text->to.offset+PtrSize, 0, 0, 0);
put(nil, ".locals", 'm', s->locals, 0, 0, 0);
- put(nil, ".args", 'm', s->args, 0, 0, 0);
+ if(s->text->textflag & NOSPLIT)
+ put(nil, ".args", 'm', ArgsSizeUnknown, 0, 0, 0);
+ else
+ put(nil, ".args", 'm', s->args, 0, 0, 0);
for(a=s->autom; a; a=a->link) {
// Emit a or p according to actual offset, even if label is wrong.
diff --git a/src/cmd/ld/lib.h b/src/cmd/ld/lib.h
index 521f12479f..614a35c529 100644
--- a/src/cmd/ld/lib.h
+++ b/src/cmd/ld/lib.h
@@ -71,6 +71,13 @@ enum
NHASH = 100003,
};
+enum
+{
+ // This value is known to the garbage collector and should be kept in
+ // sync with runtime/pkg/runtime.h
+ ArgsSizeUnknown = 0x80000000
+};
+
typedef struct Library Library;
struct Library
{