summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/cbfstool/elfheaders.c24
-rw-r--r--util/cbfstool/elfparsing.h11
2 files changed, 35 insertions, 0 deletions
diff --git a/util/cbfstool/elfheaders.c b/util/cbfstool/elfheaders.c
index 4cf3534a23..da11bfcb62 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 f7d3c23d3b..fa1c277acc 100644
--- a/util/cbfstool/elfparsing.h
+++ b/util/cbfstool/elfparsing.h
@@ -77,6 +77,17 @@ elf_headers(const struct buffer *pinput,
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
* pointer on success.