diff options
Diffstat (limited to 'BaseTools/Source/C/GenFw/Elf64Convert.c')
-rw-r--r-- | BaseTools/Source/C/GenFw/Elf64Convert.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/GenFw/Elf64Convert.c index 72d6cd16d7..713f8f7e47 100644 --- a/BaseTools/Source/C/GenFw/Elf64Convert.c +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c @@ -19,6 +19,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include <windows.h> #include <io.h> #endif +#include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -258,9 +259,12 @@ ScanSections64 ( EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; UINT32 CoffEntry; UINT32 SectionCount; + BOOLEAN FoundText; CoffEntry = 0; mCoffOffset = 0; + mTextOffset = 0; + FoundText = FALSE; // // Coff file start with a DOS header. @@ -286,7 +290,6 @@ ScanSections64 ( // First text sections. // mCoffOffset = CoffAlign(mCoffOffset); - mTextOffset = mCoffOffset; SectionCount = 0; for (i = 0; i < mEhdr->e_shnum; i++) { Elf_Shdr *shdr = GetShdrByIndex(i); @@ -310,12 +313,26 @@ ScanSections64 ( (mEhdr->e_entry < shdr->sh_addr + shdr->sh_size)) { CoffEntry = (UINT32) (mCoffOffset + mEhdr->e_entry - shdr->sh_addr); } + + // + // Set mTextOffset with the offset of the first '.text' section + // + if (!FoundText) { + mTextOffset = mCoffOffset; + FoundText = TRUE; + } + mCoffSectionsOffset[i] = mCoffOffset; mCoffOffset += (UINT32) shdr->sh_size; SectionCount ++; } } + if (!FoundText) { + Error (NULL, 0, 3000, "Invalid", "Did not find any '.text' section."); + assert (FALSE); + } + if (mEhdr->e_machine != EM_ARM) { mCoffOffset = CoffAlign(mCoffOffset); } |