aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/8l/span.c
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-09-19 22:10:34 -0400
committerRuss Cox <rsc@golang.org>2010-09-19 22:10:34 -0400
commitaf12feb8d514b5970c984be61b07c56e0e72b2ce (patch)
treec18b5c9b0cabfd8ba2cf0abb12f73bfbf8c4d96b /src/cmd/8l/span.c
parentafbee9d87d1ce9fd98e1beb9ac8945263c1f3e52 (diff)
downloadgo-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.c59
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