mirror of
https://github.com/golang/go
synced 2024-10-06 08:00:07 +00:00
cmd/ld: don't automatically mark symbols created by -X as reachable
This fixes the bug in which the linker reports "missing Go type information" when a -X option refers to a symbol that is not used. Fixes #8821. LGTM=rsc R=rsc, r CC=golang-codereviews https://golang.org/cl/151000043
This commit is contained in:
parent
56c4d0a5c6
commit
f6fc14094a
|
@ -620,6 +620,7 @@ addstrdata(char *name, char *value)
|
|||
{
|
||||
LSym *s, *sp;
|
||||
char *p;
|
||||
uchar reachable;
|
||||
|
||||
p = smprint("%s.str", name);
|
||||
sp = linklookup(ctxt, p, 0);
|
||||
|
@ -630,13 +631,17 @@ addstrdata(char *name, char *value)
|
|||
s = linklookup(ctxt, name, 0);
|
||||
s->size = 0;
|
||||
s->dupok = 1;
|
||||
reachable = s->reachable;
|
||||
addaddr(ctxt, s, sp);
|
||||
adduint32(ctxt, s, strlen(value));
|
||||
if(PtrSize == 8)
|
||||
adduint32(ctxt, s, 0); // round struct to pointer width
|
||||
|
||||
// in case reachability has already been computed
|
||||
sp->reachable = s->reachable;
|
||||
// addstring, addaddr, etc., mark the symbols as reachable.
|
||||
// In this case that is not necessarily true, so stick to what
|
||||
// we know before entering this function.
|
||||
s->reachable = reachable;
|
||||
sp->reachable = reachable;
|
||||
}
|
||||
|
||||
vlong
|
||||
|
|
|
@ -222,8 +222,10 @@ loadlib(void)
|
|||
// Since we are simulating the import, we have to provide this string.
|
||||
cgostrsym = "go.string.\"runtime/cgo\"";
|
||||
if(linkrlookup(ctxt, cgostrsym, 0) == nil) {
|
||||
s = linklookup(ctxt, cgostrsym, 0);
|
||||
s->type = SRODATA;
|
||||
s->reachable = 1;
|
||||
addstrdata(cgostrsym, "runtime/cgo");
|
||||
linklookup(ctxt, cgostrsym, 0)->type = SRODATA;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// $G $D/$F.go && $L -X main.tbd hello -X main.overwrite trumped $F.$A && ./$A.out
|
||||
// $G $D/$F.go && $L -X main.tbd hello -X main.overwrite trumped -X main.nosuchsymbol neverseen $F.$A && ./$A.out
|
||||
|
||||
// NOTE: This test is not run by 'run.go' and so not run by all.bash.
|
||||
// To run this test you must use the ./run shell script.
|
||||
|
|
Loading…
Reference in a new issue