mirror of
https://github.com/golang/go
synced 2024-11-21 23:24:41 -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:
parent
97197a6248
commit
bf43161c00
@ -143,6 +143,7 @@ struct Sym
|
|||||||
int32 value;
|
int32 value;
|
||||||
int32 sig;
|
int32 sig;
|
||||||
int32 size;
|
int32 size;
|
||||||
|
int32 align; // if non-zero, required alignment in bytes
|
||||||
uchar special;
|
uchar special;
|
||||||
uchar fnptr; // used as fn ptr
|
uchar fnptr; // used as fn ptr
|
||||||
Sym* hash; // in hash table
|
Sym* hash; // in hash table
|
||||||
|
@ -133,6 +133,7 @@ struct Sym
|
|||||||
int32 sig;
|
int32 sig;
|
||||||
int32 plt;
|
int32 plt;
|
||||||
int32 got;
|
int32 got;
|
||||||
|
int32 align; // if non-zero, required alignment in bytes
|
||||||
Sym* hash; // in hash table
|
Sym* hash; // in hash table
|
||||||
Sym* allsym; // in all symbol list
|
Sym* allsym; // in all symbol list
|
||||||
Sym* next; // in text or data list
|
Sym* next; // in text or data list
|
||||||
|
@ -134,6 +134,7 @@ struct Sym
|
|||||||
int32 dynid;
|
int32 dynid;
|
||||||
int32 plt;
|
int32 plt;
|
||||||
int32 got;
|
int32 got;
|
||||||
|
int32 align; // if non-zero, required alignment in bytes
|
||||||
Sym* hash; // in hash table
|
Sym* hash; // in hash table
|
||||||
Sym* allsym; // in all symbol list
|
Sym* allsym; // in all symbol list
|
||||||
Sym* next; // in text or data list
|
Sym* next; // in text or data list
|
||||||
|
@ -824,6 +824,8 @@ dodata(void)
|
|||||||
datsize = 0;
|
datsize = 0;
|
||||||
s = datap;
|
s = datap;
|
||||||
for(; s != nil && s->type < SSYMTAB; s = s->next) {
|
for(; s != nil && s->type < SSYMTAB; s = s->next) {
|
||||||
|
if(s->align != 0)
|
||||||
|
datsize = rnd(datsize, s->align);
|
||||||
s->type = SRODATA;
|
s->type = SRODATA;
|
||||||
s->value = datsize;
|
s->value = datsize;
|
||||||
datsize += rnd(s->size, PtrSize);
|
datsize += rnd(s->size, PtrSize);
|
||||||
@ -855,6 +857,8 @@ dodata(void)
|
|||||||
/* read-only ELF sections */
|
/* read-only ELF sections */
|
||||||
for(; s != nil && s->type < SELFSECT; s = s->next) {
|
for(; s != nil && s->type < SELFSECT; s = s->next) {
|
||||||
sect = addsection(&segtext, s->name, 04);
|
sect = addsection(&segtext, s->name, 04);
|
||||||
|
if(s->align != 0)
|
||||||
|
datsize = rnd(datsize, s->align);
|
||||||
sect->vaddr = datsize;
|
sect->vaddr = datsize;
|
||||||
s->type = SRODATA;
|
s->type = SRODATA;
|
||||||
s->value = datsize;
|
s->value = datsize;
|
||||||
@ -866,6 +870,8 @@ dodata(void)
|
|||||||
datsize = 0;
|
datsize = 0;
|
||||||
for(; s != nil && s->type < SDATA; s = s->next) {
|
for(; s != nil && s->type < SDATA; s = s->next) {
|
||||||
sect = addsection(&segdata, s->name, 06);
|
sect = addsection(&segdata, s->name, 06);
|
||||||
|
if(s->align != 0)
|
||||||
|
datsize = rnd(datsize, s->align);
|
||||||
sect->vaddr = datsize;
|
sect->vaddr = datsize;
|
||||||
s->type = SDATA;
|
s->type = SDATA;
|
||||||
s->value = datsize;
|
s->value = datsize;
|
||||||
@ -887,7 +893,9 @@ dodata(void)
|
|||||||
t = rnd(t, PtrSize);
|
t = rnd(t, PtrSize);
|
||||||
else if(t > 2)
|
else if(t > 2)
|
||||||
t = rnd(t, 4);
|
t = rnd(t, 4);
|
||||||
if(t & 1) {
|
if(s->align != 0)
|
||||||
|
datsize = rnd(datsize, s->align);
|
||||||
|
else if(t & 1) {
|
||||||
;
|
;
|
||||||
} else if(t & 2)
|
} else if(t & 2)
|
||||||
datsize = rnd(datsize, 2);
|
datsize = rnd(datsize, 2);
|
||||||
@ -913,7 +921,9 @@ dodata(void)
|
|||||||
t = rnd(t, PtrSize);
|
t = rnd(t, PtrSize);
|
||||||
else if(t > 2)
|
else if(t > 2)
|
||||||
t = rnd(t, 4);
|
t = rnd(t, 4);
|
||||||
if(t & 1) {
|
if(s->align != 0)
|
||||||
|
datsize = rnd(datsize, s->align);
|
||||||
|
else if(t & 1) {
|
||||||
;
|
;
|
||||||
} else if(t & 2)
|
} else if(t & 2)
|
||||||
datsize = rnd(datsize, 2);
|
datsize = rnd(datsize, 2);
|
||||||
@ -947,6 +957,8 @@ textaddress(void)
|
|||||||
for(sym = textp; sym != nil; sym = sym->next) {
|
for(sym = textp; sym != nil; sym = sym->next) {
|
||||||
if(sym->type & SSUB)
|
if(sym->type & SSUB)
|
||||||
continue;
|
continue;
|
||||||
|
if(sym->align != 0)
|
||||||
|
va = rnd(va, sym->align);
|
||||||
sym->value = 0;
|
sym->value = 0;
|
||||||
for(sub = sym; sub != S; sub = sub->sub) {
|
for(sub = sym; sub != S; sub = sub->sub) {
|
||||||
sub->value += va;
|
sub->value += va;
|
||||||
|
@ -538,6 +538,7 @@ ldelf(Biobuf *f, char *pkg, int64 len, char *pn)
|
|||||||
s->np = sect->size;
|
s->np = sect->size;
|
||||||
}
|
}
|
||||||
s->size = sect->size;
|
s->size = sect->size;
|
||||||
|
s->align = sect->align;
|
||||||
if(s->type == STEXT) {
|
if(s->type == STEXT) {
|
||||||
if(etextp)
|
if(etextp)
|
||||||
etextp->next = s;
|
etextp->next = s;
|
||||||
|
Loading…
Reference in New Issue
Block a user