[PATCH 1/6] x86: relocs: generalize Elf structure names

2013-04-12 Thread Kees Cook
In preparation for making the reloc tool operate on 64-bit relocations,
generalize the structure names for easy recompilation via #defines.

Based on work by Neill Clift and Michael Davidson.

Signed-off-by: Kees Cook 
---
 arch/x86/tools/relocs.c |  170 +++
 1 file changed, 99 insertions(+), 71 deletions(-)

diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c
index 79d67bd..fd28ef7 100644
--- a/arch/x86/tools/relocs.c
+++ b/arch/x86/tools/relocs.c
@@ -12,20 +12,42 @@
 #include 
 #include 
 
+#define ElfW(type) _ElfW(ELF_BITS, type)
+#define _ElfW(bits, type)  __ElfW(bits, type)
+#define __ElfW(bits, type) Elf##bits##_##type
+
+#define ELF_BITS   32
+#define ELF_MACHINEEM_386
+#define ELF_MACHINE_NAME   "i386"
+#define SHT_REL_TYPE   SHT_REL
+
+#define ELF_CLASS  ELFCLASS32
+#define ELF_R_SYM(val) ELF32_R_SYM(val)
+#define ELF_R_TYPE(val)ELF32_R_TYPE(val)
+#define ELF_ST_TYPE(o) ELF32_ST_TYPE(o)
+#define ELF_ST_BIND(o) ELF32_ST_BIND(o)
+#define ELF_ST_VISIBILITY(o)   ELF32_ST_VISIBILITY(o)
+
+#define Elf_RelElfW(Rel)
+#define Elf_Ehdr   ElfW(Ehdr)
+#define Elf_Phdr   ElfW(Phdr)
+#define Elf_Shdr   ElfW(Shdr)
+#define Elf_SymElfW(Sym)
+
 static void die(char *fmt, ...);
 
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
-static Elf32_Ehdr ehdr;
+static Elf_Ehdr ehdr;
 static unsigned long reloc_count, reloc_idx;
 static unsigned long *relocs;
 static unsigned long reloc16_count, reloc16_idx;
 static unsigned long *relocs16;
 
 struct section {
-   Elf32_Shdr shdr;
+   Elf_Shdr   shdr;
struct section *link;
-   Elf32_Sym  *symtab;
-   Elf32_Rel  *reltab;
+   Elf_Sym*symtab;
+   Elf_Rel*reltab;
char   *strtab;
 };
 static struct section *secs;
@@ -240,7 +262,7 @@ static const char *sec_name(unsigned shndx)
return name;
 }
 
-static const char *sym_name(const char *sym_strtab, Elf32_Sym *sym)
+static const char *sym_name(const char *sym_strtab, Elf_Sym *sym)
 {
const char *name;
name = "";
@@ -274,6 +296,12 @@ static uint32_t elf32_to_cpu(uint32_t val)
return le32_to_cpu(val);
 }
 
+#define elf_half_to_cpu(x) elf16_to_cpu(x)
+#define elf_word_to_cpu(x) elf32_to_cpu(x)
+#define elf_addr_to_cpu(x) elf32_to_cpu(x)
+#define elf_off_to_cpu(x)  elf32_to_cpu(x)
+#define elf_xword_to_cpu(x)elf32_to_cpu(x)
+
 static void read_ehdr(FILE *fp)
 {
if (fread(, sizeof(ehdr), 1, fp) != 1) {
@@ -283,8 +311,8 @@ static void read_ehdr(FILE *fp)
if (memcmp(ehdr.e_ident, ELFMAG, SELFMAG) != 0) {
die("No ELF magic\n");
}
-   if (ehdr.e_ident[EI_CLASS] != ELFCLASS32) {
-   die("Not a 32 bit executable\n");
+   if (ehdr.e_ident[EI_CLASS] != ELF_CLASS) {
+   die("Not a %d bit executable\n", ELF_BITS);
}
if (ehdr.e_ident[EI_DATA] != ELFDATA2LSB) {
die("Not a LSB ELF executable\n");
@@ -293,36 +321,36 @@ static void read_ehdr(FILE *fp)
die("Unknown ELF version\n");
}
/* Convert the fields to native endian */
-   ehdr.e_type  = elf16_to_cpu(ehdr.e_type);
-   ehdr.e_machine   = elf16_to_cpu(ehdr.e_machine);
-   ehdr.e_version   = elf32_to_cpu(ehdr.e_version);
-   ehdr.e_entry = elf32_to_cpu(ehdr.e_entry);
-   ehdr.e_phoff = elf32_to_cpu(ehdr.e_phoff);
-   ehdr.e_shoff = elf32_to_cpu(ehdr.e_shoff);
-   ehdr.e_flags = elf32_to_cpu(ehdr.e_flags);
-   ehdr.e_ehsize= elf16_to_cpu(ehdr.e_ehsize);
-   ehdr.e_phentsize = elf16_to_cpu(ehdr.e_phentsize);
-   ehdr.e_phnum = elf16_to_cpu(ehdr.e_phnum);
-   ehdr.e_shentsize = elf16_to_cpu(ehdr.e_shentsize);
-   ehdr.e_shnum = elf16_to_cpu(ehdr.e_shnum);
-   ehdr.e_shstrndx  = elf16_to_cpu(ehdr.e_shstrndx);
+   ehdr.e_type  = elf_half_to_cpu(ehdr.e_type);
+   ehdr.e_machine   = elf_half_to_cpu(ehdr.e_machine);
+   ehdr.e_version   = elf_word_to_cpu(ehdr.e_version);
+   ehdr.e_entry = elf_addr_to_cpu(ehdr.e_entry);
+   ehdr.e_phoff = elf_off_to_cpu(ehdr.e_phoff);
+   ehdr.e_shoff = elf_off_to_cpu(ehdr.e_shoff);
+   ehdr.e_flags = elf_word_to_cpu(ehdr.e_flags);
+   ehdr.e_ehsize= elf_half_to_cpu(ehdr.e_ehsize);
+   ehdr.e_phentsize = elf_half_to_cpu(ehdr.e_phentsize);
+   ehdr.e_phnum = elf_half_to_cpu(ehdr.e_phnum);
+   ehdr.e_shentsize = elf_half_to_cpu(ehdr.e_shentsize);
+   ehdr.e_shnum = elf_half_to_cpu(ehdr.e_shnum);
+   ehdr.e_shstrndx  = elf_half_to_cpu(ehdr.e_shstrndx);
 
if ((ehdr.e_type != ET_EXEC) && (ehdr.e_type != ET_DYN)) {
die("Unsupported ELF header type\n");
}
-   if 

[PATCH 1/6] x86: relocs: generalize Elf structure names

2013-04-12 Thread Kees Cook
In preparation for making the reloc tool operate on 64-bit relocations,
generalize the structure names for easy recompilation via #defines.

Based on work by Neill Clift and Michael Davidson.

Signed-off-by: Kees Cook keesc...@chromium.org
---
 arch/x86/tools/relocs.c |  170 +++
 1 file changed, 99 insertions(+), 71 deletions(-)

diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c
index 79d67bd..fd28ef7 100644
--- a/arch/x86/tools/relocs.c
+++ b/arch/x86/tools/relocs.c
@@ -12,20 +12,42 @@
 #include regex.h
 #include tools/le_byteshift.h
 
+#define ElfW(type) _ElfW(ELF_BITS, type)
+#define _ElfW(bits, type)  __ElfW(bits, type)
+#define __ElfW(bits, type) Elf##bits##_##type
+
+#define ELF_BITS   32
+#define ELF_MACHINEEM_386
+#define ELF_MACHINE_NAME   i386
+#define SHT_REL_TYPE   SHT_REL
+
+#define ELF_CLASS  ELFCLASS32
+#define ELF_R_SYM(val) ELF32_R_SYM(val)
+#define ELF_R_TYPE(val)ELF32_R_TYPE(val)
+#define ELF_ST_TYPE(o) ELF32_ST_TYPE(o)
+#define ELF_ST_BIND(o) ELF32_ST_BIND(o)
+#define ELF_ST_VISIBILITY(o)   ELF32_ST_VISIBILITY(o)
+
+#define Elf_RelElfW(Rel)
+#define Elf_Ehdr   ElfW(Ehdr)
+#define Elf_Phdr   ElfW(Phdr)
+#define Elf_Shdr   ElfW(Shdr)
+#define Elf_SymElfW(Sym)
+
 static void die(char *fmt, ...);
 
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
-static Elf32_Ehdr ehdr;
+static Elf_Ehdr ehdr;
 static unsigned long reloc_count, reloc_idx;
 static unsigned long *relocs;
 static unsigned long reloc16_count, reloc16_idx;
 static unsigned long *relocs16;
 
 struct section {
-   Elf32_Shdr shdr;
+   Elf_Shdr   shdr;
struct section *link;
-   Elf32_Sym  *symtab;
-   Elf32_Rel  *reltab;
+   Elf_Sym*symtab;
+   Elf_Rel*reltab;
char   *strtab;
 };
 static struct section *secs;
@@ -240,7 +262,7 @@ static const char *sec_name(unsigned shndx)
return name;
 }
 
-static const char *sym_name(const char *sym_strtab, Elf32_Sym *sym)
+static const char *sym_name(const char *sym_strtab, Elf_Sym *sym)
 {
const char *name;
name = noname;
@@ -274,6 +296,12 @@ static uint32_t elf32_to_cpu(uint32_t val)
return le32_to_cpu(val);
 }
 
+#define elf_half_to_cpu(x) elf16_to_cpu(x)
+#define elf_word_to_cpu(x) elf32_to_cpu(x)
+#define elf_addr_to_cpu(x) elf32_to_cpu(x)
+#define elf_off_to_cpu(x)  elf32_to_cpu(x)
+#define elf_xword_to_cpu(x)elf32_to_cpu(x)
+
 static void read_ehdr(FILE *fp)
 {
if (fread(ehdr, sizeof(ehdr), 1, fp) != 1) {
@@ -283,8 +311,8 @@ static void read_ehdr(FILE *fp)
if (memcmp(ehdr.e_ident, ELFMAG, SELFMAG) != 0) {
die(No ELF magic\n);
}
-   if (ehdr.e_ident[EI_CLASS] != ELFCLASS32) {
-   die(Not a 32 bit executable\n);
+   if (ehdr.e_ident[EI_CLASS] != ELF_CLASS) {
+   die(Not a %d bit executable\n, ELF_BITS);
}
if (ehdr.e_ident[EI_DATA] != ELFDATA2LSB) {
die(Not a LSB ELF executable\n);
@@ -293,36 +321,36 @@ static void read_ehdr(FILE *fp)
die(Unknown ELF version\n);
}
/* Convert the fields to native endian */
-   ehdr.e_type  = elf16_to_cpu(ehdr.e_type);
-   ehdr.e_machine   = elf16_to_cpu(ehdr.e_machine);
-   ehdr.e_version   = elf32_to_cpu(ehdr.e_version);
-   ehdr.e_entry = elf32_to_cpu(ehdr.e_entry);
-   ehdr.e_phoff = elf32_to_cpu(ehdr.e_phoff);
-   ehdr.e_shoff = elf32_to_cpu(ehdr.e_shoff);
-   ehdr.e_flags = elf32_to_cpu(ehdr.e_flags);
-   ehdr.e_ehsize= elf16_to_cpu(ehdr.e_ehsize);
-   ehdr.e_phentsize = elf16_to_cpu(ehdr.e_phentsize);
-   ehdr.e_phnum = elf16_to_cpu(ehdr.e_phnum);
-   ehdr.e_shentsize = elf16_to_cpu(ehdr.e_shentsize);
-   ehdr.e_shnum = elf16_to_cpu(ehdr.e_shnum);
-   ehdr.e_shstrndx  = elf16_to_cpu(ehdr.e_shstrndx);
+   ehdr.e_type  = elf_half_to_cpu(ehdr.e_type);
+   ehdr.e_machine   = elf_half_to_cpu(ehdr.e_machine);
+   ehdr.e_version   = elf_word_to_cpu(ehdr.e_version);
+   ehdr.e_entry = elf_addr_to_cpu(ehdr.e_entry);
+   ehdr.e_phoff = elf_off_to_cpu(ehdr.e_phoff);
+   ehdr.e_shoff = elf_off_to_cpu(ehdr.e_shoff);
+   ehdr.e_flags = elf_word_to_cpu(ehdr.e_flags);
+   ehdr.e_ehsize= elf_half_to_cpu(ehdr.e_ehsize);
+   ehdr.e_phentsize = elf_half_to_cpu(ehdr.e_phentsize);
+   ehdr.e_phnum = elf_half_to_cpu(ehdr.e_phnum);
+   ehdr.e_shentsize = elf_half_to_cpu(ehdr.e_shentsize);
+   ehdr.e_shnum = elf_half_to_cpu(ehdr.e_shnum);
+   ehdr.e_shstrndx  = elf_half_to_cpu(ehdr.e_shstrndx);
 
if ((ehdr.e_type != ET_EXEC)  (ehdr.e_type != ET_DYN)) {
die(Unsupported ELF header