summaryrefslogtreecommitdiff
path: root/util/cbfstool/elfheaders.c
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2017-12-18 14:50:22 -0700
committerAaron Durbin <adurbin@chromium.org>2017-12-19 22:28:20 +0000
commitfacf14996c32efef0c0bf63c0424069858787c6e (patch)
treef9710c9213a905ca8d71ba4b1a581923315f148e /util/cbfstool/elfheaders.c
parent60d9ce3937f15cff56218a08d9ccfd5d0358fbfc (diff)
downloadcoreboot-facf14996c32efef0c0bf63c0424069858787c6e.tar.xz
util/cbfstool: calculate cbfs file size for xip stages
The initial lookup for cbfs location for xip stages is implicitly using the ELF size assuming it's relatively equivalent. However, if the ELF that is being converted contains debug information or other metadata then the location lookup can fail because the ELF is considerably bigger than the real footprint. BUG=b:70801221 Change-Id: I47024dcd8205a09885d3a3f76e255eb5e3c55d9e Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://review.coreboot.org/22936 Reviewed-by: Furquan Shaikh <furquan@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'util/cbfstool/elfheaders.c')
-rw-r--r--util/cbfstool/elfheaders.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/util/cbfstool/elfheaders.c b/util/cbfstool/elfheaders.c
index acb25a7475..36226639d0 100644
--- a/util/cbfstool/elfheaders.c
+++ b/util/cbfstool/elfheaders.c
@@ -1440,3 +1440,26 @@ int elf_writer_add_rel(struct elf_writer *ew, const char *sym, Elf64_Addr addr)
return add_rel(rel_sec, &rel);
}
+
+int elf_program_file_size(const struct buffer *input, size_t *file_size)
+{
+ Elf64_Ehdr ehdr;
+ Elf64_Phdr *phdr;
+ int i;
+ size_t loadable_file_size = 0;
+
+ if (elf_headers(input, &ehdr, &phdr, NULL))
+ return -1;
+
+ for (i = 0; i < ehdr.e_phnum; i++) {
+ if (phdr[i].p_type != PT_LOAD)
+ continue;
+ loadable_file_size += phdr[i].p_filesz;
+ }
+
+ *file_size = loadable_file_size;
+
+ free(phdr);
+
+ return 0;
+}