From bf43161c00d1214983f85a1535d226ab19287aac Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 30 Nov 2011 13:24:16 -0800 Subject: [PATCH] ld: align ELF data sections fixes #2506 R=rsc, iant CC=golang-dev https://golang.org/cl/5440066 --- src/cmd/5l/l.h | 1 + src/cmd/6l/l.h | 1 + src/cmd/8l/l.h | 1 + src/cmd/ld/data.c | 16 ++++++++++++++-- src/cmd/ld/ldelf.c | 1 + 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; -- 2.48.1