aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2011-11-30 13:24:16 -0800
committerIan Lance Taylor <iant@golang.org>2011-11-30 13:24:16 -0800
commitbf43161c00d1214983f85a1535d226ab19287aac (patch)
tree2bf0791a44fd9543b2df019b682113d2977c56c2
parent97197a6248e5239fc3491f8acbd1dccc5ec3d509 (diff)
downloadgo-bf43161c00d1214983f85a1535d226ab19287aac.tar.gz
go-bf43161c00d1214983f85a1535d226ab19287aac.zip
ld: align ELF data sections
fixes #2506 R=rsc, iant CC=golang-dev https://golang.org/cl/5440066
-rw-r--r--src/cmd/5l/l.h1
-rw-r--r--src/cmd/6l/l.h1
-rw-r--r--src/cmd/8l/l.h1
-rw-r--r--src/cmd/ld/data.c16
-rw-r--r--src/cmd/ld/ldelf.c1
5 files changed, 18 insertions, 2 deletions
diff --git a/src/cmd/5l/l.h b/src/cmd/5l/l.h
index dabe93d37b..b1a48ded89 100644
--- a/src/cmd/5l/l.h
+++ b/src/cmd/5l/l.h
@@ -143,6 +143,7 @@ struct Sym
int32 value;
int32 sig;
int32 size;
+ int32 align; // if non-zero, required alignment in bytes
uchar special;
uchar fnptr; // used as fn ptr
Sym* hash; // in hash table
diff --git a/src/cmd/6l/l.h b/src/cmd/6l/l.h
index 9457f3afc1..5f62239a1e 100644
--- a/src/cmd/6l/l.h
+++ b/src/cmd/6l/l.h
@@ -133,6 +133,7 @@ struct Sym
int32 sig;
int32 plt;
int32 got;
+ int32 align; // if non-zero, required alignment in bytes
Sym* hash; // in hash table
Sym* allsym; // in all symbol list
Sym* next; // in text or data list
diff --git a/src/cmd/8l/l.h b/src/cmd/8l/l.h
index a721f384b8..b974f464bf 100644
--- a/src/cmd/8l/l.h
+++ b/src/cmd/8l/l.h
@@ -134,6 +134,7 @@ struct Sym
int32 dynid;
int32 plt;
int32 got;
+ int32 align; // if non-zero, required alignment in bytes
Sym* hash; // in hash table
Sym* allsym; // in all symbol list
Sym* next; // in text or data list
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c
index a7f61c927b..d34d23c770 100644
--- a/src/cmd/ld/data.c
+++ b/src/cmd/ld/data.c
@@ -824,6 +824,8 @@ dodata(void)
datsize = 0;
s = datap;
for(; s != nil && s->type < SSYMTAB; s = s->next) {
+ if(s->align != 0)
+ datsize = rnd(datsize, s->align);
s->type = SRODATA;
s->value = datsize;
datsize += rnd(s->size, PtrSize);
@@ -855,6 +857,8 @@ dodata(void)
/* read-only ELF sections */
for(; s != nil && s->type < SELFSECT; s = s->next) {
sect = addsection(&segtext, s->name, 04);
+ if(s->align != 0)
+ datsize = rnd(datsize, s->align);
sect->vaddr = datsize;
s->type = SRODATA;
s->value = datsize;
@@ -866,6 +870,8 @@ dodata(void)
datsize = 0;
for(; s != nil && s->type < SDATA; s = s->next) {
sect = addsection(&segdata, s->name, 06);
+ if(s->align != 0)
+ datsize = rnd(datsize, s->align);
sect->vaddr = datsize;
s->type = SDATA;
s->value = datsize;
@@ -887,7 +893,9 @@ dodata(void)
t = rnd(t, PtrSize);
else if(t > 2)
t = rnd(t, 4);
- if(t & 1) {
+ if(s->align != 0)
+ datsize = rnd(datsize, s->align);
+ else if(t & 1) {
;
} else if(t & 2)
datsize = rnd(datsize, 2);
@@ -913,7 +921,9 @@ dodata(void)
t = rnd(t, PtrSize);
else if(t > 2)
t = rnd(t, 4);
- if(t & 1) {
+ if(s->align != 0)
+ datsize = rnd(datsize, s->align);
+ else if(t & 1) {
;
} else if(t & 2)
datsize = rnd(datsize, 2);
@@ -947,6 +957,8 @@ textaddress(void)
for(sym = textp; sym != nil; sym = sym->next) {
if(sym->type & SSUB)
continue;
+ if(sym->align != 0)
+ va = rnd(va, sym->align);
sym->value = 0;
for(sub = sym; sub != S; sub = sub->sub) {
sub->value += va;
diff --git a/src/cmd/ld/ldelf.c b/src/cmd/ld/ldelf.c
index 924687867b..bd4f3e7d87 100644
--- a/src/cmd/ld/ldelf.c
+++ b/src/cmd/ld/ldelf.c
@@ -538,6 +538,7 @@ ldelf(Biobuf *f, char *pkg, int64 len, char *pn)
s->np = sect->size;
}
s->size = sect->size;
+ s->align = sect->align;
if(s->type == STEXT) {
if(etextp)
etextp->next = s;