From af12feb8d514b5970c984be61b07c56e0e72b2ce Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sun, 19 Sep 2010 22:10:34 -0400 Subject: 6l, 8l: clean up ELF code, fix NaCl R=r CC=golang-dev https://golang.org/cl/2221042 --- src/cmd/8l/span.c | 59 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 11 deletions(-) (limited to 'src/cmd/8l/span.c') diff --git a/src/cmd/8l/span.c b/src/cmd/8l/span.c index 373ab8a9c6..105d18b9f8 100644 --- a/src/cmd/8l/span.c +++ b/src/cmd/8l/span.c @@ -35,9 +35,10 @@ void span(void) { Prog *p, *q; - int32 i, v, c, idat; + int32 i, v, c, idat, etext, rodata, erodata; int m, n, again; Sym *s; + Section *sect; xdefine("etext", STEXT, 0L); xdefine("rodata", SRODATA, 0L); @@ -110,13 +111,16 @@ start: textsize = c; n++; }while(again); - xdefine("etext", STEXT, c); + etext = c; + c += textpad; /* * allocate read-only data to the text segment. */ + if(HEADTYPE == 8) + c = rnd(c, INITRND); c = rnd(c, 8); - xdefine("rodata", SRODATA, c); + rodata = c; for(i=0; ilink) { if(s->type != SRODATA) @@ -127,22 +131,59 @@ start: s->value = c; c += v; } - xdefine("erodata", SRODATA, c); + erodata = c; if(INITRND) { - INITDAT = rnd(c+textpad, INITRND); + INITDAT = rnd(c, INITRND); if(INITDAT != idat) { idat = INITDAT; goto start; } } + xdefine("etext", STEXT, etext); + xdefine("rodata", SRODATA, rodata); + xdefine("erodata", SRODATA, erodata); + if(debug['v']) Bprint(&bso, "etext = %lux\n", c); Bflush(&bso); for(p = textp; p != P; p = p->pcond) p->from.sym->value = p->pc; textsize = c - INITTEXT; + + segtext.rwx = 05; + if(HEADTYPE == 8) { + segtext.vaddr = INITTEXT; + segtext.len = rodata - INITTEXT; + segtext.fileoff = HEADR; + segtext.filelen = etext - INITTEXT; + + segrodata.rwx = 04; + segrodata.vaddr = rodata; + segrodata.len = erodata - rodata; + segrodata.filelen = segrodata.len; + } else { + segtext.vaddr = INITTEXT - HEADR; + segtext.len = INITDAT - INITTEXT + HEADR; + segtext.fileoff = 0; + segtext.filelen = segtext.len; + } + + sect = addsection(&segtext, ".text", 05); + sect->vaddr = INITTEXT; + sect->len = etext - sect->vaddr; + + if(HEADTYPE == 8) + sect = addsection(&segrodata, ".rodata", 04); + else + sect = addsection(&segtext, ".rodata", 04); + sect->vaddr = rodata; + sect->len = erodata - rodata; + + segdata.vaddr += INITDAT; + for(sect=segdata.sect; sect!=nil; sect=sect->next) + sect->vaddr += INITDAT; } void @@ -151,12 +192,8 @@ xdefine(char *p, int t, int32 v) Sym *s; s = lookup(p, 0); - if(s->type == 0 || s->type == SXREF) { - s->type = t; - s->value = v; - } - if(s->type == STEXT && s->value == 0) - s->value = v; + s->type = t; + s->value = v; } void -- cgit v1.3-5-g9baa