From cc08d9232c4875a11b9e2a8097e069467d79f31f Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 16 Apr 2014 17:11:44 -0400 Subject: liblink: add leaf bit to object file format Without the leaf bit, the linker cannot record the correct frame size in the symbol table, and then stack traces get mangled. (Only for ARM.) Fixes #7338. Fixes #7347. LGTM=iant R=iant CC=golang-codereviews https://golang.org/cl/88550043 --- src/cmd/ld/pcln.c | 7 +++++-- src/cmd/link/testdata/autosection.6 | Bin 888 -> 889 bytes src/cmd/link/testdata/autoweak.6 | Bin 425 -> 426 bytes src/cmd/link/testdata/dead.6 | Bin 1054 -> 1060 bytes src/cmd/link/testdata/hello.6 | Bin 271 -> 272 bytes src/cmd/link/testdata/layout.6 | Bin 429 -> 430 bytes src/cmd/link/testdata/pclntab.6 | Bin 4603 -> 4607 bytes 7 files changed, 5 insertions(+), 2 deletions(-) (limited to 'src/cmd') diff --git a/src/cmd/ld/pcln.c b/src/cmd/ld/pcln.c index bdb139f7a4..b2370f2a91 100644 --- a/src/cmd/ld/pcln.c +++ b/src/cmd/ld/pcln.c @@ -112,7 +112,7 @@ pclntab(void) { int32 i, nfunc, start, funcstart; LSym *ftab, *s; - int32 off, end; + int32 off, end, frameptrsize; int64 funcdata_bytes; Pcln *pcln; Pciter it; @@ -173,7 +173,10 @@ pclntab(void) // when a called function doesn't have argument information. // We need to make sure everything has argument information // and then remove this. - off = setuint32(ctxt, ftab, off, ctxt->cursym->locals + PtrSize); + frameptrsize = PtrSize; + if(ctxt->cursym->leaf) + frameptrsize = 0; + off = setuint32(ctxt, ftab, off, ctxt->cursym->locals + frameptrsize); if(pcln != &zpcln) { renumberfiles(pcln->file, pcln->nfile, &pcln->pcfile); diff --git a/src/cmd/link/testdata/autosection.6 b/src/cmd/link/testdata/autosection.6 index 3a2e35a5b2..f392e41680 100644 Binary files a/src/cmd/link/testdata/autosection.6 and b/src/cmd/link/testdata/autosection.6 differ diff --git a/src/cmd/link/testdata/autoweak.6 b/src/cmd/link/testdata/autoweak.6 index 1fd54ed7e6..a694e47291 100644 Binary files a/src/cmd/link/testdata/autoweak.6 and b/src/cmd/link/testdata/autoweak.6 differ diff --git a/src/cmd/link/testdata/dead.6 b/src/cmd/link/testdata/dead.6 index e0cdecea96..270416f0b6 100644 Binary files a/src/cmd/link/testdata/dead.6 and b/src/cmd/link/testdata/dead.6 differ diff --git a/src/cmd/link/testdata/hello.6 b/src/cmd/link/testdata/hello.6 index 9ec799b4f3..448d40f76b 100644 Binary files a/src/cmd/link/testdata/hello.6 and b/src/cmd/link/testdata/hello.6 differ diff --git a/src/cmd/link/testdata/layout.6 b/src/cmd/link/testdata/layout.6 index c5121ff154..56d416a1a0 100644 Binary files a/src/cmd/link/testdata/layout.6 and b/src/cmd/link/testdata/layout.6 differ diff --git a/src/cmd/link/testdata/pclntab.6 b/src/cmd/link/testdata/pclntab.6 index 0f7ab6dd78..91583a3fd4 100644 Binary files a/src/cmd/link/testdata/pclntab.6 and b/src/cmd/link/testdata/pclntab.6 differ -- cgit v1.3-5-g9baa