Commit 154c84cd authored by Akshat Kumar's avatar Akshat Kumar Committed by Russ Cox

cmd/6l: Fixes for 64-bit Plan 9

Plan 9 versions for amd64 have 2 megabyte pages.
This also fixes the logic for 32-bit vs 64-bit Plan 9,
making 64-bit the default, and adds logic to generate
a symbols table.

R=golang-dev, rsc, rminnich, ality, 0intro
CC=golang-dev, john
https://golang.org/cl/6218046
parent fefae6ee
...@@ -715,7 +715,8 @@ asmb(void) ...@@ -715,7 +715,8 @@ asmb(void)
ElfPhdr *ph, *pph; ElfPhdr *ph, *pph;
ElfShdr *sh; ElfShdr *sh;
Section *sect; Section *sect;
int o; Sym *sym;
int i, o;
if(debug['v']) if(debug['v'])
Bprint(&bso, "%5.2f asmb\n", cputime()); Bprint(&bso, "%5.2f asmb\n", cputime());
...@@ -763,6 +764,7 @@ asmb(void) ...@@ -763,6 +764,7 @@ asmb(void)
default: default:
diag("unknown header type %d", HEADTYPE); diag("unknown header type %d", HEADTYPE);
case Hplan9x32: case Hplan9x32:
case Hplan9x64:
case Helf: case Helf:
break; break;
case Hdarwin: case Hdarwin:
...@@ -798,7 +800,7 @@ asmb(void) ...@@ -798,7 +800,7 @@ asmb(void)
Bflush(&bso); Bflush(&bso);
switch(HEADTYPE) { switch(HEADTYPE) {
default: default:
case Hplan9x32: case Hplan9x64:
case Helf: case Helf:
debug['s'] = 1; debug['s'] = 1;
symo = HEADR+segtext.len+segdata.filelen; symo = HEADR+segtext.len+segdata.filelen;
...@@ -833,6 +835,19 @@ asmb(void) ...@@ -833,6 +835,19 @@ asmb(void)
dwarfemitdebugsections(); dwarfemitdebugsections();
} }
break; break;
case Hplan9x64:
asmplan9sym();
cflush();
sym = lookup("pclntab", 0);
if(sym != nil) {
lcsize = sym->np;
for(i=0; i < lcsize; i++)
cput(sym->p[i]);
cflush();
}
break;
case Hwindows: case Hwindows:
if(debug['v']) if(debug['v'])
Bprint(&bso, "%5.2f dwarf\n", cputime()); Bprint(&bso, "%5.2f dwarf\n", cputime());
...@@ -848,7 +863,7 @@ asmb(void) ...@@ -848,7 +863,7 @@ asmb(void)
cseek(0L); cseek(0L);
switch(HEADTYPE) { switch(HEADTYPE) {
default: default:
case Hplan9x32: /* plan9 */ case Hplan9x64: /* plan9 */
magic = 4*26*26+7; magic = 4*26*26+7;
magic |= 0x00008000; /* fat header */ magic |= 0x00008000; /* fat header */
lputb(magic); /* magic */ lputb(magic); /* magic */
...@@ -862,7 +877,7 @@ asmb(void) ...@@ -862,7 +877,7 @@ asmb(void)
lputb(lcsize); /* line offsets */ lputb(lcsize); /* line offsets */
vputb(vl); /* va of entry */ vputb(vl); /* va of entry */
break; break;
case Hplan9x64: /* plan9 */ case Hplan9x32: /* plan9 */
magic = 4*26*26+7; magic = 4*26*26+7;
lputb(magic); /* magic */ lputb(magic); /* magic */
lputb(segtext.filelen); /* sizes */ lputb(segtext.filelen); /* sizes */
......
...@@ -58,8 +58,8 @@ Header headers[] = { ...@@ -58,8 +58,8 @@ Header headers[] = {
}; };
/* /*
* -Hplan9x32 -T4136 -R4096 is plan9 64-bit format * -Hplan9x32 -T4128 -R4096 is plan9 32-bit format
* -Hplan9 -T4128 -R4096 is plan9 32-bit format * -Hplan9 -T0x200028 -R0x200000 is plan9 64-bit format
* -Helf -T0x80110000 -R4096 is ELF32 * -Helf -T0x80110000 -R4096 is ELF32
* -Hdarwin -Tx -Rx is apple MH-exec * -Hdarwin -Tx -Rx is apple MH-exec
* -Hlinux -Tx -Rx is linux elf-exec * -Hlinux -Tx -Rx is linux elf-exec
...@@ -164,7 +164,7 @@ main(int argc, char *argv[]) ...@@ -164,7 +164,7 @@ main(int argc, char *argv[])
diag("unknown -H option"); diag("unknown -H option");
errorexit(); errorexit();
case Hplan9x32: /* plan 9 */ case Hplan9x32: /* plan 9 */
HEADR = 32L+8L; HEADR = 32L;
if(INITTEXT == -1) if(INITTEXT == -1)
INITTEXT = 4096+HEADR; INITTEXT = 4096+HEADR;
if(INITDAT == -1) if(INITDAT == -1)
...@@ -173,13 +173,13 @@ main(int argc, char *argv[]) ...@@ -173,13 +173,13 @@ main(int argc, char *argv[])
INITRND = 4096; INITRND = 4096;
break; break;
case Hplan9x64: /* plan 9 */ case Hplan9x64: /* plan 9 */
HEADR = 32L; HEADR = 32L + 8L;
if(INITTEXT == -1) if(INITTEXT == -1)
INITTEXT = 4096+32; INITTEXT = 0x200000+HEADR;
if(INITDAT == -1) if(INITDAT == -1)
INITDAT = 0; INITDAT = 0;
if(INITRND == -1) if(INITRND == -1)
INITRND = 4096; INITRND = 0x200000;
break; break;
case Helf: /* elf32 executable */ case Helf: /* elf32 executable */
HEADR = rnd(52L+3*32L, 16); HEADR = rnd(52L+3*32L, 16);
......
...@@ -1058,7 +1058,7 @@ address(void) ...@@ -1058,7 +1058,7 @@ address(void)
segdata.filelen = 0; segdata.filelen = 0;
if(HEADTYPE == Hwindows) if(HEADTYPE == Hwindows)
segdata.fileoff = segtext.fileoff + rnd(segtext.len, PEFILEALIGN); segdata.fileoff = segtext.fileoff + rnd(segtext.len, PEFILEALIGN);
if(HEADTYPE == Hplan9x32) if(HEADTYPE == Hplan9x64 || HEADTYPE == Hplan9x32)
segdata.fileoff = segtext.fileoff + segtext.filelen; segdata.fileoff = segtext.fileoff + segtext.filelen;
data = nil; data = nil;
noptr = nil; noptr = nil;
......
...@@ -125,7 +125,7 @@ asmelfsym(void) ...@@ -125,7 +125,7 @@ asmelfsym(void)
static void static void
putplan9sym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go) putplan9sym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go)
{ {
int i; int i, l;
USED(go); USED(go);
USED(ver); USED(ver);
...@@ -144,6 +144,11 @@ putplan9sym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go) ...@@ -144,6 +144,11 @@ putplan9sym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go)
case 'z': case 'z':
case 'Z': case 'Z':
case 'm': case 'm':
l = 4;
if(HEADTYPE == Hplan9x64 && !debug['8']) {
lputb(addr>>32);
l = 8;
}
lputb(addr); lputb(addr);
cput(t+0x80); /* 0x80 is variable length */ cput(t+0x80); /* 0x80 is variable length */
...@@ -164,7 +169,7 @@ putplan9sym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go) ...@@ -164,7 +169,7 @@ putplan9sym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go)
cput(s[i]); cput(s[i]);
cput(0); cput(0);
} }
symsize += 4 + 1 + i + 1; symsize += l + 1 + i + 1;
break; break;
default: default:
return; return;
......
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