mirror of https://github.com/golang/go.git
cmd/pack: stop parsing object files to generate __.SYMDEF
Nothing looks at __.SYMDEF, and the object file format is changing. R=golang-dev, r CC=golang-dev https://golang.org/cl/39580044
This commit is contained in:
parent
4230044bb8
commit
4c01a23cf1
|
|
@ -649,49 +649,28 @@ matchhdr(char *p, char **lastp)
|
||||||
void
|
void
|
||||||
scanobj(Biobuf *b, Arfile *ap, long size)
|
scanobj(Biobuf *b, Arfile *ap, long size)
|
||||||
{
|
{
|
||||||
int obj, goobject;
|
int goobject;
|
||||||
vlong offset, offset1;
|
vlong offset;
|
||||||
Dir *d;
|
|
||||||
static int lastobj = -1;
|
|
||||||
uchar buf[4];
|
uchar buf[4];
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
if (!allobj) /* non-object file encountered */
|
if (!allobj) /* non-object file encountered */
|
||||||
return;
|
return;
|
||||||
offset = Boffset(b);
|
offset = Boffset(b);
|
||||||
obj = objtype(b, 0);
|
|
||||||
if (obj < 0) { /* not an object file */
|
memset(buf, 0, sizeof buf);
|
||||||
/* maybe a foreign object file */
|
Bread(b, buf, 4);
|
||||||
Bseek(b, offset, 0);
|
|
||||||
memset(buf, 0, sizeof buf);
|
/* maybe a foreign object file? that's okay */
|
||||||
Bread(b, buf, 4);
|
if((buf[0] == 0x7F && buf[1] == 'E' && buf[2] == 'L' && buf[3] == 'F') || // ELF
|
||||||
|
(buf[0] == 0x4c && buf[1] == 0x01 || buf[0] == 0x64 && buf[1] == 0x86) || // Windows PE
|
||||||
/* maybe a foreign object file? that's okay */
|
(buf[0] == 0xFE && buf[1] == 0xED && buf[2] == 0xFA && (buf[3]&~1) == 0xCE) || // Mach-O big-endian
|
||||||
if((buf[0] == 0x7F && buf[1] == 'E' && buf[2] == 'L' && buf[3] == 'F') || // ELF
|
(buf[3] == 0xFE && buf[2] == 0xED && buf[1] == 0xFA && (buf[0]&~1) == 0xCE)) { // Mach-O little-endian
|
||||||
(buf[0] == 0x4c && buf[1] == 0x01 || buf[0] == 0x64 && buf[1] == 0x86) || // Windows PE
|
|
||||||
(buf[0] == 0xFE && buf[1] == 0xED && buf[2] == 0xFA && (buf[3]&~1) == 0xCE) || // Mach-O big-endian
|
|
||||||
(buf[3] == 0xFE && buf[2] == 0xED && buf[1] == 0xFA && (buf[0]&~1) == 0xCE)) { // Mach-O little-endian
|
|
||||||
Bseek(b, offset, 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gflag || strcmp(file, pkgdef) != 0) { /* don't clear allobj if it's pkg defs */
|
|
||||||
fprint(2, "pack: non-object file %s\n", file);
|
|
||||||
errors++;
|
|
||||||
allobj = 0;
|
|
||||||
}
|
|
||||||
d = dirfstat(Bfildes(b));
|
|
||||||
if (d != nil && d->length == 0) {
|
|
||||||
fprint(2, "pack: zero length file %s\n", file);
|
|
||||||
errors++;
|
|
||||||
}
|
|
||||||
free(d);
|
|
||||||
Bseek(b, offset, 0);
|
Bseek(b, offset, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
goobject = 1;
|
goobject = 1;
|
||||||
offset1 = Boffset(b);
|
|
||||||
Bseek(b, offset, 0);
|
Bseek(b, offset, 0);
|
||||||
p = Brdstr(b, '\n', 1);
|
p = Brdstr(b, '\n', 1);
|
||||||
|
|
||||||
|
|
@ -702,12 +681,11 @@ scanobj(Biobuf *b, Arfile *ap, long size)
|
||||||
// Go metadata is present.
|
// Go metadata is present.
|
||||||
if(BGETC(b) == '!')
|
if(BGETC(b) == '!')
|
||||||
goobject = 0;
|
goobject = 0;
|
||||||
|
Bseek(b, offset, 0);
|
||||||
|
|
||||||
Bseek(b, offset1, 0);
|
|
||||||
if(p == nil || strncmp(p, "go object ", 10) != 0) {
|
if(p == nil || strncmp(p, "go object ", 10) != 0) {
|
||||||
fprint(2, "pack: malformed object file %s\n", file);
|
fprint(2, "pack: malformed object file %s\n", file);
|
||||||
errors++;
|
errors++;
|
||||||
Bseek(b, offset, 0);
|
|
||||||
free(p);
|
free(p);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -721,24 +699,7 @@ scanobj(Biobuf *b, Arfile *ap, long size)
|
||||||
}
|
}
|
||||||
free(p);
|
free(p);
|
||||||
|
|
||||||
// Old check. Should be impossible since objhdrs match, but keep the check anyway.
|
USED(ap);
|
||||||
if (lastobj >= 0 && obj != lastobj) {
|
|
||||||
fprint(2, "pack: inconsistent object file %s\n", file);
|
|
||||||
errors++;
|
|
||||||
allobj = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
lastobj = obj;
|
|
||||||
|
|
||||||
if (!readar(b, obj, offset+size, 0)) {
|
|
||||||
fprint(2, "pack: invalid symbol reference in file %s\n", file);
|
|
||||||
errors++;
|
|
||||||
allobj = 0;
|
|
||||||
Bseek(b, offset, 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Bseek(b, offset, 0);
|
|
||||||
objtraverse(objsym, ap);
|
|
||||||
if (gflag && goobject) {
|
if (gflag && goobject) {
|
||||||
scanpkg(b, size);
|
scanpkg(b, size);
|
||||||
Bseek(b, offset, 0);
|
Bseek(b, offset, 0);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue