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 <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/12218
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
This commit is contained in:
Aaron Durbin 2015-10-27 16:21:55 -05:00
parent 1762502929
commit 4f930c9649
2 changed files with 35 additions and 0 deletions

View File

@ -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 {

View File

@ -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