]> Cypherpunks repositories - gostls13.git/commitdiff
6l cleanup: last set of magic numbers for elf64 moved to ld/elf64*.
authorRob Pike <r@golang.org>
Mon, 20 Jul 2009 20:19:47 +0000 (13:19 -0700)
committerRob Pike <r@golang.org>
Mon, 20 Jul 2009 20:19:47 +0000 (13:19 -0700)
R=rsc
DELTA=68  (21 added, 28 deleted, 19 changed)
OCL=31857
CL=31864

src/cmd/6l/asm.c
src/cmd/6l/obj.c
src/cmd/ld/elf64.c
src/cmd/ld/elf64.h

index 3db010a78808b02aebf2ea6cb9ce57756f2ba875..c1d0a4d97a63221ed3a744f6c0e2f8068cf25b7e 100644 (file)
@@ -196,6 +196,7 @@ asmb(void)
                debug['8'] = 1; /* 64-bit addresses */
                v = rnd(HEADR+textsize, INITRND);
                seek(cout, v, 0);
+               elf64init();
                break;
        }
 
@@ -545,15 +546,14 @@ asmb(void)
                eh->machine = 62;       /* machine = AMD64 */
                eh->version = EV_CURRENT;
                eh->entry = entryvalue();
-               eh->phoff = 64L;
-               eh->shoff = 64L+56*eh->phnum;
-               eh->ehsize = 64;
-               eh->phentsize = 56;
-               eh->shentsize = 64;
-
-               elf64writehdr();
-               elf64writephdrs();
-               elf64writeshdrs();
+
+               a = 0;
+               a += elf64writehdr();
+               a += elf64writephdrs();
+               a += elf64writeshdrs();
+               if (a > ELF64FULLHDRSIZE) {
+                       diag("ELF64FULLHDRSIZE too small:", a);
+               }
                cflush();
 
                /* string table */
index a2a520396f634eae0e242c9efd3dbbac679e41ba..8538e064e4dc4e35160555829551790707f96791 100644 (file)
@@ -197,7 +197,7 @@ main(int argc, char *argv[])
                        INITRND = 4096;
                break;
        case 7: /* elf64 executable */
-               HEADR = elf64headr();
+               HEADR = ELF64FULLHDRSIZE;
                if(INITTEXT == -1)
                        INITTEXT = (1<<22)+HEADR;
                if(INITDAT == -1)
index 9b191693d9c076b3ceaeaa75973d5d6f5cb7158f..ea1a39b418090386b7a962b6ee8b42c0ffee0d42 100644 (file)
@@ -7,13 +7,23 @@
 #include "../ld/elf64.h"
 
 #define        NSECT   16
-static int     nume64str;
+static int     numstr;
 static Elf64Hdr        hdr;
 static Elf64PHdr       *phdr[NSECT];
 static Elf64SHdr       *shdr[NSECT];
 static char    *sname[NSECT];
 static char    *str[NSECT];
 
+void
+elf64init(void)
+{
+       hdr.phoff = ELF64HDRSIZE;
+       hdr.shoff = ELF64HDRSIZE;
+       hdr.ehsize = ELF64HDRSIZE;
+       hdr.phentsize = ELF64PHDRSIZE;
+       hdr.shentsize = ELF64SHDRSIZE;
+}
+
 void
 elf64phdr(Elf64PHdr *e)
 {
@@ -56,10 +66,10 @@ void
 elf64writestrtable(void)
 {
        int i;
-       int size;
+       uint32 size;
 
        size = 0;
-       for (i = 0; i < nume64str; i++)
+       for (i = 0; i < numstr; i++)
                size += putelf64strtab(str[i]);
        if (size > STRTABSIZE)
                diag("elf64 string table overflow");
@@ -68,56 +78,32 @@ elf64writestrtable(void)
 void
 e64addstr(char *name)
 {
-       if (nume64str >= NSECT) {
+       if (numstr >= NSECT) {
                diag("too many elf strings");
                return;
        }
-       str[nume64str++] = strdup(name);
+       str[numstr++] = strdup(name);
        stroffset += strlen(name)+1;
 }
 
 uint32
-elf64headr(void)
-{
-       uint32 a;
-
-       a = 64;         /* a.out header */
-
-       /* TODO: calculate these byte counts properly */
-       a += 56;        /* page zero seg */
-       a += 56;        /* text seg */
-       a += 56;        /* stack seg */
-
-       a += 64;        /* nil sect */
-       a += 64;        /* .text sect */
-       a += 64;        /* .data seg */
-       a += 64;        /* .bss sect */
-       a += 64;        /* .shstrtab sect - strings for headers */
-       if (!debug['s']) {
-               a += 56;        /* symdat seg */
-               a += 64;        /* .gosymtab sect */
-               a += 64;        /* .gopclntab sect */
-       }
-
-       return a;
-}
-
-void
 elf64writeshdrs(void)
 {
        int i;
 
        for (i = 0; i < hdr.shnum; i++)
                elf64shdr(sname[i], shdr[i]);
+       return hdr.shnum * ELF64SHDRSIZE;
 }
 
-void
+uint32
 elf64writephdrs(void)
 {
        int i;
 
        for (i = 0; i < hdr.phnum; i++)
                elf64phdr(phdr[i]);
+       return hdr.phnum * ELF64PHDRSIZE;
 }
 
 Elf64PHdr*
@@ -131,6 +117,7 @@ newElf64PHdr(void)
                diag("too many phdrs");
        else
                phdr[hdr.phnum++] = e;
+       hdr.shoff += ELF64PHDRSIZE;
        return e;
 }
 
@@ -159,7 +146,7 @@ getElf64Hdr(void)
        return &hdr;
 }
 
-void
+uint32
 elf64writehdr()
 {
        int i;
@@ -179,4 +166,5 @@ elf64writehdr()
        WPUT(hdr.shentsize);
        WPUT(hdr.shnum);
        WPUT(hdr.shstrndx);
+       return ELF64HDRSIZE;
 }
index fc71744e64221c849edc2c9a629dc4ff63e46bcb..f42ae9425202ccc617a717edc1289bde6ddb1d46 100644 (file)
@@ -67,6 +67,7 @@ struct Elf64Hdr
        Elf64_Half      shnum;  /* Number of section header entries */
        Elf64_Half      shstrndx;       /* Section name string table index */
 };
+#define        ELF64HDRSIZE    64
 
 /* E ident indexes */
 #define        EI_MAG0 0       /* File identification */
@@ -112,6 +113,7 @@ struct Elf64PHdr
        Elf64_Xword     memsz;  /* Size of segment in memory */
        Elf64_Xword     align;  /* Alignment of segment */
 };
+#define        ELF64PHDRSIZE   56
 
 /* P types */
 #define        PT_NULL         0       /* Unused entry */
@@ -140,6 +142,7 @@ struct Elf64SHdr
        Elf64_Xword     addralign;      /* Address alignment boundary */
        Elf64_Xword     entsize;        /* Size of entries, if section has table */
 };
+#define        ELF64SHDRSIZE   64
 
 /* S types */
 #define SHT_NULL       0       /* Unused section header */
@@ -166,16 +169,18 @@ struct Elf64SHdr
 #define        SHF_MASKOS      0x0F000000      /* Environment-specific use */
 #define        SHF_MASKPROC    0xF0000000      /* Processor-specific use */
 
+void   elf64init(void);
 Elf64Hdr       *getElf64Hdr();
 Elf64SHdr      *newElf64SHdr(char*);
 Elf64PHdr      *newElf64PHdr();
-uint32 elf64headr(void);
-void   elf64writehdr(void);
-void   elf64writephdrs(void);
-void   elf64writeshdrs(void);
+uint32 elf64writehdr(void);
+uint32 elf64writephdrs(void);
+uint32 elf64writeshdrs(void);
 void   elf64writestrtable(void);
 
 extern int     nume64phdr;
 extern int     nume64shdr;
 
 #define        STRTABSIZE      256
+/* Amount of space to reserve at the start of the file; may waste some */
+#define        ELF64FULLHDRSIZE        2048