Commit 45407bd5 authored by Lucio De Re's avatar Lucio De Re Committed by Russ Cox

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
parent bf2d403d
......@@ -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]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment