1
0
mirror of https://github.com/golang/go synced 2024-11-21 15:34:45 -07:00

ld: align ELF data sections

fixes #2506

R=rsc, iant
CC=golang-dev
https://golang.org/cl/5440066
This commit is contained in:
Ian Lance Taylor 2011-11-30 13:24:16 -08:00
parent 97197a6248
commit bf43161c00
5 changed files with 18 additions and 2 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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;