From 4f930c96496250d167bc1a397fa1faa9f20b3168 Mon Sep 17 00:00:00 2001 From: Aaron Durbin Date: Tue, 27 Oct 2015 16:21:55 -0500 Subject: cbfstool: add ELF header initialization helper In order for one to extract ELF files from cbfs it's helpful to have common code which creates a default executable ELF header for the provided constraints. BUG=None TEST=With follow up patch am able to extract out romstage as an ELF file. Change-Id: Ib8f2456f41b79c6c0430861e33e8b909725013f1 Signed-off-by: Aaron Durbin Reviewed-on: http://review.coreboot.org/12218 Reviewed-by: Patrick Georgi Tested-by: build bot (Jenkins) Reviewed-by: Paul Menzel --- util/cbfstool/elfheaders.c | 24 ++++++++++++++++++++++++ util/cbfstool/elfparsing.h | 11 +++++++++++ 2 files changed, 35 insertions(+) diff --git a/util/cbfstool/elfheaders.c b/util/cbfstool/elfheaders.c index 4cf3534a232d..da11bfcb6269 100644 --- a/util/cbfstool/elfheaders.c +++ b/util/cbfstool/elfheaders.c @@ -635,6 +635,30 @@ elf_headers(const struct buffer *pinput, * +------------------+ */ +void elf_init_eheader(Elf64_Ehdr *ehdr, int machine, int nbits, int endian) +{ + memset(ehdr, 0, sizeof(*ehdr)); + ehdr->e_ident[EI_MAG0] = ELFMAG0; + ehdr->e_ident[EI_MAG1] = ELFMAG1; + ehdr->e_ident[EI_MAG2] = ELFMAG2; + ehdr->e_ident[EI_MAG3] = ELFMAG3; + ehdr->e_ident[EI_CLASS] = nbits; + ehdr->e_ident[EI_DATA] = endian; + ehdr->e_ident[EI_VERSION] = EV_CURRENT; + ehdr->e_type = ET_EXEC; + ehdr->e_machine = machine; + ehdr->e_version = EV_CURRENT; + if (nbits == ELFCLASS64) { + ehdr->e_ehsize = sizeof(Elf64_Ehdr); + ehdr->e_phentsize = sizeof(Elf64_Phdr); + ehdr->e_shentsize = sizeof(Elf64_Shdr); + } else { + ehdr->e_ehsize = sizeof(Elf32_Ehdr); + ehdr->e_phentsize = sizeof(Elf32_Phdr); + ehdr->e_shentsize = sizeof(Elf32_Shdr); + } +} + /* Arbitray maximum number of sections. */ #define MAX_SECTIONS 16 struct elf_writer_section { diff --git a/util/cbfstool/elfparsing.h b/util/cbfstool/elfparsing.h index f7d3c23d3b5a..fa1c277acca7 100644 --- a/util/cbfstool/elfparsing.h +++ b/util/cbfstool/elfparsing.h @@ -76,6 +76,17 @@ elf_headers(const struct buffer *pinput, /* ELF writing support. */ struct elf_writer; +/* + * Initialize a 64-bit ELF header provided the inputs. While the structure + * is a 64-bit header one can specify a 32-bit machine. The 64-bit version + * is just used as a common structure. If one wants to specify the entry + * point, for example, the caller can set it after filling in the common + * bits. The machine, nbits, and endian values should be from the ELF + * definitions (e.g. EM_386, ELFCLASS32, and ELFDATA2LSB) found in elf.h + * with no endian conversion required. + */ +void elf_init_eheader(Elf64_Ehdr *ehdr, int machine, int nbits, int endian); + /* * Initialize a new ELF writer. Deafult machine type, endianness, etc is * copied from the passed in Elf64_Ehdr. Returns NULL on failure, valid -- cgit v1.2.3