From d8a286d52651d44be649c502b4853c131a64829c Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Fri, 24 Nov 2023 12:26:43 +0000 Subject: WIP - ImageBase --- src/util/elf2efi.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/util/elf2efi.c b/src/util/elf2efi.c index 31b2a2bb1..8fa86deef 100644 --- a/src/util/elf2efi.c +++ b/src/util/elf2efi.c @@ -728,6 +728,48 @@ static struct pe_section * process_section ( struct elf_file *elf, return new; } +/** + * Update image base address + * + * @v pe_header PE file header + * @v pe_sections List of PE sections + * @v pe_reltab PE relocation table + */ +static void update_image_base ( struct pe_header *pe_header, + struct pe_section *pe_sections, + struct pe_relocs *pe_reltab ) { + struct pe_section *section; + struct pe_relocs *pe_rel; + unsigned long base; + + /* Set ImageBase to the highest possible value, leaving space + * for the PE header itself (if not deliberately overlapped). + */ + for ( section = pe_sections ; section ; section = section->next ) { + base = ( section->hdr.VirtualAddress - + section->hdr.PointerToRawData ); + if ( ( pe_header->nt.OptionalHeader.ImageBase == 0 ) || + ( pe_header->nt.OptionalHeader.ImageBase > base ) ) { + pe_header->nt.OptionalHeader.ImageBase = base; + } + } + base = pe_header->nt.OptionalHeader.ImageBase; + + /* Adjust RVAs to match ImageBase */ + pe_header->nt.OptionalHeader.AddressOfEntryPoint -= base; + pe_header->nt.OptionalHeader.BaseOfCode -= base; +#if defined(EFI_TARGET32) + pe_header->nt.OptionalHeader.BaseOfData -= base; +#endif + pe_header->nt.OptionalHeader.SizeOfImage -= base; + for ( section = pe_sections ; section ; section = section->next ) { + section->hdr.VirtualAddress -= base; + } + for ( pe_rel = pe_reltab ; pe_rel ; pe_rel = pe_rel->next ) { + pe_rel->start_rva -= base; + } +} + /** * Process relocation record * @@ -1112,6 +1154,9 @@ static void elf2pe ( const char *elf_name, const char *pe_name, } } + /* Update image base address */ + update_image_base ( &pe_header, pe_sections, pe_reltab ); + /* Create the .reloc section */ *(next_pe_section) = create_reloc_section ( &pe_header, pe_reltab ); next_pe_section = &(*next_pe_section)->next; -- cgit