diff options
| author | Carl Shapiro <cshapiro@google.com> | 2013-03-28 14:36:23 -0700 |
|---|---|---|
| committer | Carl Shapiro <cshapiro@google.com> | 2013-03-28 14:36:23 -0700 |
| commit | c676b8b27b128e6369da7c3a3f2bbf52bde945c8 (patch) | |
| tree | 6f6ae22ad4df8f416cd4055f9662c335e96f5f4e /src/cmd/ld | |
| parent | 7e7f89933b9d6eba5d298d3f619b5ef4166e5052 (diff) | |
| download | go-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.c | 5 | ||||
| -rw-r--r-- | src/cmd/ld/lib.h | 7 |
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 { |
