]> Cypherpunks repositories - gostls13.git/commitdiff
ld: align ELF data sections
authorIan Lance Taylor <iant@golang.org>
Wed, 30 Nov 2011 21:24:16 +0000 (13:24 -0800)
committerIan Lance Taylor <iant@golang.org>
Wed, 30 Nov 2011 21:24:16 +0000 (13:24 -0800)
fixes #2506

R=rsc, iant
CC=golang-dev
https://golang.org/cl/5440066

src/cmd/5l/l.h
src/cmd/6l/l.h
src/cmd/8l/l.h
src/cmd/ld/data.c
src/cmd/ld/ldelf.c

index dabe93d37b7b0f58f13c7d2c7bcc52bc8da941d0..b1a48ded89c7b48bdd0292cee1c7b502274461b7 100644 (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
index 9457f3afc1fe619e6a1353909a5f45f30867273d..5f62239a1eeebd3c58f1126f967da71aeb434ac2 100644 (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
index a721f384b84255465175baff220b238f21d4d55b..b974f464bfa843345b32013f69bd95d318525b0f 100644 (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
index a7f61c927bdd3ab1195425d86689dafd23429d3d..d34d23c7702875457d38e7068acb60a30f4e4184 100644 (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;
index 924687867b6c52c078140338eee083e9399becaa..bd4f3e7d871e54b9f03b5f8012217ccf950a1d81 100644 (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;