Commit 94d89ede authored by Rob Pike's avatar Rob Pike

take care of a few more magic numbers

R=rsc
DELTA=51  (41 added, 0 deleted, 10 changed)
OCL=31815
CL=31818
parent 51c0a841
...@@ -126,8 +126,10 @@ asmb(void) ...@@ -126,8 +126,10 @@ asmb(void)
uchar *op1; uchar *op1;
vlong vl, va, fo, w, symo; vlong vl, va, fo, w, symo;
vlong symdatva = 0x99LL<<32; vlong symdatva = 0x99LL<<32;
int strtabindex;
Elf64PHdr *ph; Elf64PHdr *ph;
Elf64SHdr *sh; Elf64SHdr *sh;
char eident[EI_NIDENT];
if(debug['v']) if(debug['v'])
Bprint(&bso, "%5.2f asmb\n", cputime()); Bprint(&bso, "%5.2f asmb\n", cputime());
...@@ -501,6 +503,7 @@ asmb(void) ...@@ -501,6 +503,7 @@ asmb(void)
w = STRTABSIZE; w = STRTABSIZE;
strtabindex = nume64shdr;
sh = newElf64SHdr(".shstrtab"); sh = newElf64SHdr(".shstrtab");
sh->type = SHT_STRTAB; sh->type = SHT_STRTAB;
sh->off = fo; sh->off = fo;
...@@ -531,15 +534,19 @@ asmb(void) ...@@ -531,15 +534,19 @@ asmb(void)
sh->entsize = 24; sh->entsize = 24;
// write out the main header */ // write out the main header */
strnput("\177ELF", 4); /* e_ident */ memset(eident, 0, sizeof eident);
cput(2); /* class = 64 bit */ eident[EI_MAG0] = '\177';
cput(1); /* data = LSB */ eident[EI_MAG1] = 'E';
cput(1); /* version = CURRENT */ eident[EI_MAG2] = 'L';
strnput("", 9); eident[EI_MAG3] = 'F';
eident[EI_CLASS] = ELFCLASS64;
wputl(2); /* type = EXEC */ eident[EI_DATA] = ELFDATA2LSB;
eident[EI_VERSION] = EV_CURRENT;
strnput(eident, EI_NIDENT);
wputl(ET_EXEC); /* type = EXEC */
wputl(62); /* machine = AMD64 */ wputl(62); /* machine = AMD64 */
lputl(1L); /* version = CURRENT */ lputl(EV_CURRENT); /* version = CURRENT */
vputl(entryvalue()); /* entry vaddr */ vputl(entryvalue()); /* entry vaddr */
vputl(64L); /* offset to first phdr */ vputl(64L); /* offset to first phdr */
vputl(64L+56*nume64phdr); /* offset to first shdr */ vputl(64L+56*nume64phdr); /* offset to first shdr */
...@@ -549,7 +556,7 @@ asmb(void) ...@@ -549,7 +556,7 @@ asmb(void)
wputl(nume64phdr); /* # of Phdrs */ wputl(nume64phdr); /* # of Phdrs */
wputl(64); /* Shdr size */ wputl(64); /* Shdr size */
wputl(nume64shdr); /* # of Shdrs */ wputl(nume64shdr); /* # of Shdrs */
wputl(4); /* Shdr with strings */ wputl(strtabindex); /* Shdr with strings */
elf64writephdrs(); elf64writephdrs();
elf64writeshdrs(); elf64writeshdrs();
......
...@@ -49,9 +49,10 @@ typedef struct Elf64Hdr Elf64Hdr; ...@@ -49,9 +49,10 @@ typedef struct Elf64Hdr Elf64Hdr;
typedef struct Elf64SHdr Elf64SHdr; typedef struct Elf64SHdr Elf64SHdr;
typedef struct Elf64PHdr Elf64PHdr; typedef struct Elf64PHdr Elf64PHdr;
#define EI_NIDENT 16
struct Elf64Hdr struct Elf64Hdr
{ {
uchar ident[16]; /* ELF identification */ uchar ident[EI_NIDENT]; /* ELF identification */
Elf64_Half type; /* Object file type */ Elf64_Half type; /* Object file type */
Elf64_Half machine; /* Machine type */ Elf64_Half machine; /* Machine type */
Elf64_Word version; /* Object file version */ Elf64_Word version; /* Object file version */
...@@ -67,6 +68,39 @@ struct Elf64Hdr ...@@ -67,6 +68,39 @@ struct Elf64Hdr
Elf64_Half shstrndx; /* Section name string table index */ Elf64_Half shstrndx; /* Section name string table index */
}; };
/* E ident indexes */
#define EI_MAG0 0 /* File identification */
#define EI_MAG1 1
#define EI_MAG2 2
#define EI_MAG3 3
#define EI_CLASS 4 /* File class */
#define EI_DATA 5 /* Data encoding */
#define EI_VERSION 6 /* File version */
#define EI_OSABI 7 /* OS/ABI identification */
#define EI_ABIVERSION 8 /* ABI version */
#define EI_PAD 9 /*Start of padding bytes */
/* E types */
#define ET_NONE 0 /* No file type */
#define ET_REL 1 /* Relocatable object file */
#define ET_EXEC 2 /* Executable file */
#define ET_DYN 3 /* Shared object file */
#define ET_CORE 4 /* Core file */
#define ET_LOOS 0xFE00 /* Environment-specific use */
#define ET_HIOS 0xFEFF
#define ET_LOPROC 0xFF00 /* Processor-specific use */
#define ET_HIPROC 0xFFFF
/* E classes */
#define ELFCLASS32 1 /* 32-bit objects */
#define ELFCLASS64 2 /* 64-bit objects */
/* E endians */
#define ELFDATA2LSB 1 /* little-endian */
#define ELFDATA2MSB 2 /* big-endian */
#define EV_CURRENT 1 /* current version of format */
struct Elf64PHdr struct Elf64PHdr
{ {
Elf64_Word type; /* Type of segment */ Elf64_Word type; /* Type of segment */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment