From cc08d9232c4875a11b9e2a8097e069467d79f31f Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 16 Apr 2014 17:11:44 -0400 Subject: [PATCH] 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 src/liblink/objfile.c | 8 +++++++- src/pkg/debug/goobj/read.go | 2 ++ 9 files changed, 14 insertions(+), 3 deletions(-) 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 3a2e35a5b227ebca6093cb358a0762e802a51680..f392e416808f3a92e59faf51628911f57b0d4d1f 100644 GIT binary patch delta 46 zcmeyt_LFUboPvdcWwM2-WmoPxQ5k)e^PMOu=%k+Fhrex8D3L6L%?iGrcAm63s!so_Ms=#8@k7y%#- B3{3z4 diff --git a/src/cmd/link/testdata/dead.6 b/src/cmd/link/testdata/dead.6 index e0cdecea96b934cdb54ef1416a675cd3d4dca273..270416f0b6c6bc5ed628cdbab77cd7bdbdfb6d55 100644 GIT binary patch delta 66 zcmbQov4mrSoPvdcWwM2-Wm WPOf5HJXww@esUdC&gR!lmW%*tbQ87! diff --git a/src/cmd/link/testdata/hello.6 b/src/cmd/link/testdata/hello.6 index 9ec799b4f39e5c1f2944573a46c7f7a091cbe895..448d40f76b8ecf08d4b0418e17e66c055484e244 100644 GIT binary patch delta 45 zcmeBYn!q$cPQk*!GTFk^GA%j9EL9;qHATU(ph&^cOu^9D%FxKl&|;!p!o;~n03E~) A0RR91 delta 45 zcmbQh)Xy|QPQl#3$k52tA}z_>$XLNQKTpB2ph&^cM8VM5%E-XV)NrC*!o>N701BE6 AVE_OC diff --git a/src/cmd/link/testdata/layout.6 b/src/cmd/link/testdata/layout.6 index c5121ff154a5b12ba4f13ff087a3d8c37ef4f345..56d416a1a0a62316d4c47109bfbd111b6f91d4b0 100644 GIT binary patch delta 45 zcmZ3>ypDN-oPvdcWwM2-Wmfg?wz-_|57Xo#!A<~p-xR9= delta 62 zcmeyb{9Ac~oPxQ5k)e^PMOu=%k+Fhrex8D3L6L%?iGrcAm63s!so_SuRZN>-G6}J6 S{=;6!wz-<`H`C;D!43dhUlbGo diff --git a/src/liblink/objfile.c b/src/liblink/objfile.c index b52b29ca59..0c51e795f5 100644 --- a/src/liblink/objfile.c +++ b/src/liblink/objfile.c @@ -49,6 +49,7 @@ // // - args [int] // - locals [int] +// - leaf [int] // - nlocal [int] // - local [nlocal automatics] // - pcln [pcln table] @@ -291,8 +292,11 @@ writesym(Link *ctxt, Biobuf *b, LSym *s) if(s->dupok) Bprint(ctxt->bso, "dupok "); Bprint(ctxt->bso, "size=%lld value=%lld", (vlong)s->size, (vlong)s->value); - if(s->type == STEXT) + if(s->type == STEXT) { Bprint(ctxt->bso, " args=%#llux locals=%#llux", (uvlong)s->args, (uvlong)s->locals); + if(s->leaf) + Bprint(ctxt->bso, " leaf"); + } Bprint(ctxt->bso, "\n"); for(p=s->text; p != nil; p = p->link) Bprint(ctxt->bso, "\t%#06ux %P\n", (int)p->pc, p); @@ -346,6 +350,7 @@ writesym(Link *ctxt, Biobuf *b, LSym *s) if(s->type == STEXT) { wrint(b, s->args); wrint(b, s->locals); + wrint(b, s->leaf); n = 0; for(a = s->autom; a != nil; a = a->link) n++; @@ -566,6 +571,7 @@ readsym(Link *ctxt, Biobuf *f, char *pkg, char *pn) if(s->type == STEXT) { s->args = rdint(f); s->locals = rdint(f); + s->leaf = rdint(f); n = rdint(f); for(i=0; i