From: Russ Cox Date: Thu, 3 Nov 2011 16:07:47 +0000 (-0400) Subject: gopack: do not look for Go metadata in non-Go objects X-Git-Tag: weekly.2011-11-08~65 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d6ff3c11774bf36c797dcc6cd946819959766dc1;p=gostls13.git gopack: do not look for Go metadata in non-Go objects Fixes #2333. R=r CC=golang-dev https://golang.org/cl/5316075 --- diff --git a/src/cmd/gopack/ar.c b/src/cmd/gopack/ar.c index c02903bc7a..9125f2987e 100644 --- a/src/cmd/gopack/ar.c +++ b/src/cmd/gopack/ar.c @@ -654,7 +654,7 @@ matchhdr(char *p, char **lastp) void scanobj(Biobuf *b, Arfile *ap, long size) { - int obj; + int obj, goobject; vlong offset, offset1; Dir *d; static int lastobj = -1; @@ -695,9 +695,19 @@ scanobj(Biobuf *b, Arfile *ap, long size) return; } + goobject = 1; offset1 = Boffset(b); Bseek(b, offset, 0); p = Brdstr(b, '\n', 1); + + // After the go object header comes the Go metadata, + // followed by ! on a line by itself. If this is not a Go object, + // the ! comes immediately. Catch that so we can avoid + // the call to scanpkg below, since scanpkg assumes that the + // Go metadata is present. + if(Bgetc(b) == '!') + goobject = 0; + Bseek(b, offset1, 0); if(p == nil || strncmp(p, "go object ", 10) != 0) { fprint(2, "gopack: malformed object file %s\n", file); @@ -734,7 +744,7 @@ scanobj(Biobuf *b, Arfile *ap, long size) } Bseek(b, offset, 0); objtraverse(objsym, ap); - if (gflag) { + if (gflag && goobject) { scanpkg(b, size); Bseek(b, offset, 0); }