]> Cypherpunks repositories - gostls13.git/commitdiff
ld: fix freebsd build reverting .interp move
authorGustavo Niemeyer <gustavo@niemeyer.net>
Thu, 21 Jul 2011 06:48:56 +0000 (03:48 -0300)
committerGustavo Niemeyer <gustavo@niemeyer.net>
Thu, 21 Jul 2011 06:48:56 +0000 (03:48 -0300)
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/4794046

src/cmd/5l/asm.c
src/cmd/6l/asm.c
src/cmd/8l/asm.c
src/cmd/ld/data.c
src/cmd/ld/elf.c

index 8a60ff74a90feaf4b8d21c2e9a0dba20381a74bc..5b7f6f111d1f9363d97d683cb5f159629fd907b4 100644 (file)
@@ -185,14 +185,6 @@ doelf(void)
                elfstr[ElfStrRelPlt] = addstring(shstrtab, ".rel.plt");
                elfstr[ElfStrPlt] = addstring(shstrtab, ".plt");
 
-               /* interpreter string */
-               if(interpreter == nil)
-                       interpreter = linuxdynld;
-               s = lookup(".interp", 0);
-               s->type = SELFROSECT;
-               s->reachable = 1;
-               addstring(s, interpreter);
-
                /* dynamic symbol table - first entry all zeros */
                s = lookup(".dynsym", 0);
                s->type = SELFROSECT;
@@ -492,7 +484,9 @@ asmb(void)
                        sh->type = SHT_PROGBITS;
                        sh->flags = SHF_ALLOC;
                        sh->addralign = 1;
-                       shsym(sh, lookup(".interp", 0));
+                       if(interpreter == nil)
+                               interpreter = linuxdynld;
+                       elfinterp(sh, startva, interpreter);
 
                        ph = newElfPhdr();
                        ph->type = PT_INTERP;
@@ -638,7 +632,7 @@ asmb(void)
                a += elfwritephdrs();
                a += elfwriteshdrs();
                cflush();
-               if(a > ELFRESERVE)      
+               if(a+elfwriteinterp() > ELFRESERVE)     
                        diag("ELFRESERVE too small: %d > %d", a, ELFRESERVE);
                break;
        }
index fb088fd9eebf06aba6de2f01643988ed0e8d5935..39ee2db54f15546192f3cf38e6783198821757ed 100644 (file)
@@ -591,22 +591,6 @@ doelf(void)
                elfstr[ElfStrGnuVersion] = addstring(shstrtab, ".gnu.version");
                elfstr[ElfStrGnuVersionR] = addstring(shstrtab, ".gnu.version_r");
 
-               /* interpreter string */
-               if(interpreter == nil) {
-                       switch(HEADTYPE) {
-                       case Hlinux:
-                               interpreter = linuxdynld;
-                               break;
-                       case Hfreebsd:
-                               interpreter = freebsddynld;
-                               break;
-                       }
-               }
-               s = lookup(".interp", 0);
-               s->type = SELFROSECT;
-               s->reachable = 1;
-               addstring(s, interpreter);
-
                /* dynamic symbol table - first entry all zeros */
                s = lookup(".dynsym", 0);
                s->type = SELFROSECT;
@@ -909,7 +893,7 @@ asmb(void)
                                        break;
                                }
                        }
-                       shsym(sh, lookup(".interp", 0));
+                       elfinterp(sh, startva, interpreter);
 
                        ph = newElfPhdr();
                        ph->type = PT_INTERP;
@@ -1088,7 +1072,7 @@ asmb(void)
                a += elfwritephdrs();
                a += elfwriteshdrs();
                cflush();
-               if(a > ELFRESERVE)      
+               if(a+elfwriteinterp() > ELFRESERVE)     
                        diag("ELFRESERVE too small: %d > %d", a, ELFRESERVE);
                break;
        case Hwindows:
index 5d49628588a9b06182079c31457eb394cb920f7b..22abd80491880cc3b2c527d96d317416f687c81c 100644 (file)
@@ -551,22 +551,6 @@ doelf(void)
                elfstr[ElfStrGnuVersion] = addstring(shstrtab, ".gnu.version");
                elfstr[ElfStrGnuVersionR] = addstring(shstrtab, ".gnu.version_r");
 
-               /* interpreter string */
-               if(interpreter == nil) {
-                       switch(HEADTYPE) {
-                       case Hlinux:
-                               interpreter = linuxdynld;
-                               break;
-                       case Hfreebsd:
-                               interpreter = freebsddynld;
-                               break;
-                       }
-               }
-               s = lookup(".interp", 0);
-               s->type = SELFROSECT;
-               s->reachable = 1;
-               addstring(s, interpreter);
-
                /* dynamic symbol table - first entry all zeros */
                s = lookup(".dynsym", 0);
                s->type = SELFROSECT;
@@ -964,7 +948,17 @@ asmb(void)
                        sh->type = SHT_PROGBITS;
                        sh->flags = SHF_ALLOC;
                        sh->addralign = 1;
-                       shsym(sh, lookup(".interp", 0));
+                       if(interpreter == nil) {
+                               switch(HEADTYPE) {
+                               case Hlinux:
+                                       interpreter = linuxdynld;
+                                       break;
+                               case Hfreebsd:
+                                       interpreter = freebsddynld;
+                                       break;
+                               }
+                       }
+                       elfinterp(sh, startva, interpreter);
 
                        ph = newElfPhdr();
                        ph->type = PT_INTERP;
@@ -1148,7 +1142,7 @@ asmb(void)
                a += elfwritephdrs();
                a += elfwriteshdrs();
                cflush();
-               if(a > ELFRESERVE)      
+               if(a+elfwriteinterp() > ELFRESERVE)     
                        diag("ELFRESERVE too small: %d > %d", a, ELFRESERVE);
                break;
 
index 5cf5f4d7a049f70dc0bc87d04b002b2dd9b70a7e..168f3e6d1c85fe8ae7857925294ec014ab62e66a 100644 (file)
@@ -871,7 +871,7 @@ dodata(void)
 
        /* data */
        sect = addsection(&segdata, ".data", 06);
-       sect->vaddr = 0;
+       sect->vaddr = datsize;
        for(; s != nil && s->type < SBSS; s = s->next) {
                s->type = SDATA;
                t = s->size;
index 3fe8ba83a6627224efc3f031c15e32e0fa4f99b5..f9f9ef6b2178fd2aed2e5398b670c7f765641434 100644 (file)
@@ -19,6 +19,7 @@ static        int     elf64;
 static ElfEhdr hdr;
 static ElfPhdr *phdr[NSECT];
 static ElfShdr *shdr[NSECT];
+static char    *interp;
 
 typedef struct Elfstring Elfstring;
 struct Elfstring
@@ -303,6 +304,32 @@ elfwritedynentsymsize(Sym *s, int tag, Sym *t)
        addsize(s, t);
 }
 
+int
+elfwriteinterp(void)
+{
+       int n;
+
+       if(interp == nil)
+               return 0;
+
+       n = strlen(interp)+1;
+       cseek(ELFRESERVE-n);
+       cwrite(interp, n);
+       return n;
+}
+
+void
+elfinterp(ElfShdr *sh, uint64 startva, char *p)
+{
+       int n;
+
+       interp = p;
+       n = strlen(interp)+1;
+       sh->addr = startva + ELFRESERVE - n;
+       sh->off = ELFRESERVE - n;
+       sh->size = n;
+}
+
 extern int nelfsym;
 int elfverneed;