aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/6l/pass.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/6l/pass.c')
-rw-r--r--src/cmd/6l/pass.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/cmd/6l/pass.c b/src/cmd/6l/pass.c
index 275844c9b4..ea3351239f 100644
--- a/src/cmd/6l/pass.c
+++ b/src/cmd/6l/pass.c
@@ -45,10 +45,15 @@ dodata(void)
Sym *s;
Prog *p;
int32 t, u;
+ Section *sect;
if(debug['v'])
Bprint(&bso, "%5.2f dodata\n", cputime());
Bflush(&bso);
+
+ segdata.rwx = 06;
+ segdata.vaddr = 0; /* span will += INITDAT */
+
for(p = datap; p != P; p = p->link) {
curtext = p; // for diag messages
s = p->from.sym;
@@ -79,6 +84,9 @@ dodata(void)
datsize += t;
}
elfdatsize = datsize;
+
+ sect = addsection(&segdata, ".data", 06);
+ sect->vaddr = datsize;
/* allocate small guys */
for(i=0; i<NHASH; i++)
@@ -147,6 +155,7 @@ dodata(void)
}
datsize += u;
}
+ sect->len = datsize - sect->vaddr;
}
void
@@ -155,12 +164,16 @@ dobss(void)
int i;
Sym *s;
int32 t;
+ Section *sect;
if(dynptrsize > 0) {
/* dynamic pointer section between data and bss */
datsize = rnd(datsize, 8);
}
+ sect = addsection(&segdata, ".bss", 06);
+ sect->vaddr = datsize;
+
/* now the bss */
bsssize = 0;
for(i=0; i<NHASH; i++)
@@ -175,6 +188,10 @@ dobss(void)
s->value = bsssize + dynptrsize + datsize;
bsssize += t;
}
+ sect->len = bsssize;
+
+ segdata.len = datsize+bsssize;
+ segdata.filelen = datsize;
xdefine("data", SBSS, 0);
xdefine("edata", SBSS, datsize);