From: Austin Clements Date: Fri, 5 Dec 2014 14:24:01 +0000 (-0500) Subject: [dev.cc] liblink: don't patch jumps to jumps to symbols X-Git-Tag: go1.5beta1~2688^2~1 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e04c8b063fd7d7aaded8e1ff549dbb520038c61e;p=gostls13.git [dev.cc] liblink: don't patch jumps to jumps to symbols When liblink sees something like JMP x ... x: JMP y it rewrites the first jump to jump directly to y. This is fine if y is a resolved label. However, it *also* does this if y is a function symbol, but fails to carry over the relocation that would later patch in that symbol's value. As a result, the original jump becomes either a self-jump (if relative) or a jump to PC 0 (if absolute). Fix this by disabling this optimization if the jump being patched in is a jump to a symbol. LGTM=minux R=rsc, minux CC=golang-codereviews https://golang.org/cl/185890044 --- diff --git a/src/liblink/pass.c b/src/liblink/pass.c index bc8eb43679..8721a6a796 100644 --- a/src/liblink/pass.c +++ b/src/liblink/pass.c @@ -41,7 +41,7 @@ brchain(Link *ctxt, Prog *p) int i; for(i=0; i<20; i++) { - if(p == nil || p->as != ctxt->arch->AJMP) + if(p == nil || p->as != ctxt->arch->AJMP || p->pcond == nil) return p; p = p->pcond; } @@ -56,7 +56,7 @@ brloop(Link *ctxt, Prog *p) c = 0; for(q = p; q != nil; q = q->pcond) { - if(q->as != ctxt->arch->AJMP) + if(q->as != ctxt->arch->AJMP || q->pcond == nil) break; c++; if(c >= 5000)