1
0
mirror of https://github.com/golang/go synced 2024-11-21 20:14:52 -07:00

ld: handle Plan 9 ar format

The Go version has 64 character long section names; originally,
in Plan 9, the limit was 16.  To provide compatibility, this
change allows the input length to be either the target length
or the earlier option.	The section name is extended with spaces
where required.

This has been tested to work without regressions in the
Go environment, testing the older alternative has not been
possible yet.

R=rsc
CC=golang-dev
https://golang.org/cl/4650071
This commit is contained in:
Lucio De Re 2011-08-22 23:24:38 -04:00 committed by Russ Cox
parent bf2d403de8
commit 45407bd559

View File

@ -295,19 +295,33 @@ nextar(Biobuf *bp, int off, struct ar_hdr *a)
{
int r;
int32 arsize;
char *buf;
if (off&01)
off++;
Bseek(bp, off, 0);
r = Bread(bp, a, SAR_HDR);
if(r != SAR_HDR)
return 0;
if(strncmp(a->fmag, ARFMAG, sizeof(a->fmag)))
buf = Brdline(bp, '\n');
r = Blinelen(bp);
if(buf == nil) {
if(r == 0)
return 0;
return -1;
}
if(r == SAR_HDR) {
memmove(a, buf, SAR_HDR);
} else if (r == SAR_HDR-SARNAME+16) { // old Plan 9
memset(a->name, ' ', sizeof a->name);
memmove(a, buf, 16);
memmove((char*)a+SARNAME, buf+16, SAR_HDR-SARNAME);
} else { // unexpected
return -1;
}
if(strncmp(a->fmag, ARFMAG, sizeof a->fmag))
return -1;
arsize = strtol(a->size, 0, 0);
if (arsize&1)
arsize++;
return arsize + SAR_HDR;
return arsize + r;
}
void
@ -1332,7 +1346,7 @@ Yconv(Fmt *fp)
fmtprint(fp, "<nil>");
} else {
fmtstrinit(&fmt);
fmtprint(&fmt, "%s @0x%08x [%d]", s->name, s->value, s->size);
fmtprint(&fmt, "%s @0x%08llx [%lld]", s->name, (vlong)s->value, (vlong)s->size);
for (i = 0; i < s->size; i++) {
if (!(i%8)) fmtprint(&fmt, "\n\t0x%04x ", i);
fmtprint(&fmt, "%02x ", s->p[i]);