]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/5l: fix invalid executable header on Plan 9
authorAnthony Martin <ality@pbrane.org>
Sat, 12 Jan 2013 11:13:55 +0000 (03:13 -0800)
committerAnthony Martin <ality@pbrane.org>
Sat, 12 Jan 2013 11:13:55 +0000 (03:13 -0800)
R=minux.ma, lucio.dere
CC=golang-dev
https://golang.org/cl/7094048

src/cmd/5l/asm.c
src/cmd/5l/l.h

index 7c45268117d36df78824e4697896784ed5288ae0..a38c063d54e457f9d66bb098fda14dc92bb8f99f 100644 (file)
@@ -490,6 +490,8 @@ asmb(void)
        int32 t;
        uint32 symo;
        Section *sect;
+       Sym *sym;
+       int i;
 
        if(debug['v'])
                Bprint(&bso, "%5.2f asmb\n", cputime());
@@ -546,18 +548,34 @@ asmb(void)
                        break;
                }
                cseek(symo);
-               if(iself) {
-                       if(debug['v'])
-                               Bprint(&bso, "%5.2f elfsym\n", cputime());
-                       asmelfsym();
+               switch(HEADTYPE) {
+               default:
+                       if(iself) {
+                               if(debug['v'])
+                                       Bprint(&bso, "%5.2f elfsym\n", cputime());
+                               asmelfsym();
+                               cflush();
+                               cwrite(elfstrdat, elfstrsize);
+       
+                               if(debug['v'])
+                                       Bprint(&bso, "%5.2f dwarf\n", cputime());
+                               dwarfemitdebugsections();
+                       }
+                       break;
+               case Hplan9x32:
+                       asmplan9sym();
                        cflush();
-                       cwrite(elfstrdat, elfstrsize);
 
-                       if(debug['v'])
-                               Bprint(&bso, "%5.2f dwarf\n", cputime());
-                       dwarfemitdebugsections();
+                       sym = lookup("pclntab", 0);
+                       if(sym != nil) {
+                               lcsize = sym->np;
+                               for(i=0; i < lcsize; i++)
+                                       cput(sym->p[i]);
+
+                               cflush();
+                       }
+                       break;
                }
-               cflush();
        }
 
        cursym = nil;
@@ -581,7 +599,7 @@ asmb(void)
                         - 8) / 4);             /* BL - entry code */
 
                lputl(0xef000011);              /* SWI - exit code */
-               lputl(textsize+HEADR);          /* text size */
+               lputl(segtext.filelen+HEADR);           /* text size */
                lputl(segdata.filelen);                 /* data size */
                lputl(0);                       /* sym size */
 
@@ -601,7 +619,7 @@ asmb(void)
                break;
        case Hplan9x32: /* plan 9 */
                lput(0x647);                    /* magic */
-               lput(textsize);                 /* sizes */
+               lput(segtext.filelen);                  /* sizes */
                lput(segdata.filelen);
                lput(segdata.len - segdata.filelen);
                lput(symsize);                  /* nsyms */
@@ -626,12 +644,12 @@ asmb(void)
        }
        cflush();
        if(debug['c']){
-               print("textsize=%d\n", textsize);
+               print("textsize=%d\n", segtext.filelen);
                print("datsize=%ulld\n", segdata.filelen);
                print("bsssize=%ulld\n", segdata.len - segdata.filelen);
                print("symsize=%d\n", symsize);
                print("lcsize=%d\n", lcsize);
-               print("total=%lld\n", textsize+segdata.len+symsize+lcsize);
+               print("total=%lld\n", segtext.filelen+segdata.len+symsize+lcsize);
        }
 }
 
index 0ceafdd11225cc722b7073cc1ffa0a79362adeb4..69c85578785c09f7877a55e4c7b528a974b828c4 100644 (file)
@@ -304,7 +304,6 @@ EXTERN      char*   rpath;
 EXTERN uint32  stroffset;
 EXTERN int32   symsize;
 EXTERN Sym*    textp;
-EXTERN int32   textsize;
 EXTERN int     version;
 EXTERN char    xcmp[C_GOK+1][C_GOK+1];
 EXTERN Prog    zprg;