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
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
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
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);
/* 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;
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;
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);
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);
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;