diff options
| author | Russ Cox <rsc@golang.org> | 2010-09-19 22:10:34 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2010-09-19 22:10:34 -0400 |
| commit | af12feb8d514b5970c984be61b07c56e0e72b2ce (patch) | |
| tree | c18b5c9b0cabfd8ba2cf0abb12f73bfbf8c4d96b /src/cmd/8l/span.c | |
| parent | afbee9d87d1ce9fd98e1beb9ac8945263c1f3e52 (diff) | |
| download | go-af12feb8d514b5970c984be61b07c56e0e72b2ce.tar.xz | |
6l, 8l: clean up ELF code, fix NaCl
R=r
CC=golang-dev
https://golang.org/cl/2221042
Diffstat (limited to 'src/cmd/8l/span.c')
| -rw-r--r-- | src/cmd/8l/span.c | 59 |
1 files changed, 48 insertions, 11 deletions
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; i<NHASH; i++) for(s = hash[i]; s != S; s = s->link) { 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 |
