From 7686eed1a9ed96791cfa65ec5b2f5fdaca538e53 Mon Sep 17 00:00:00 2001 From: Olivier Martin Date: Tue, 11 Jun 2013 10:56:12 +0100 Subject: [PATCH 3/8] BaseTools/GenFw: Set the PE/COFF attribute BaseOfCode with the address of the first '.text' section Before this change the alignment of the first code section was not taken into account. Change-Id: I6e6b07edb2f7e7179c9467b43857c44a8309cb68 Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Olivier Martin --- BaseTools/Source/C/GenFw/Elf32Convert.c | 20 +++++++++++++++++++- BaseTools/Source/C/GenFw/Elf64Convert.c | 19 ++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) mode change 100644 => 100755 BaseTools/Source/C/GenFw/Elf32Convert.c mode change 100644 => 100755 BaseTools/Source/C/GenFw/Elf64Convert.c diff --git a/BaseTools/Source/C/GenFw/Elf32Convert.c b/BaseTools/Source/C/GenFw/Elf32Convert.c old mode 100644 new mode 100755 index ddb45ac..58ac333 --- a/BaseTools/Source/C/GenFw/Elf32Convert.c +++ b/BaseTools/Source/C/GenFw/Elf32Convert.c @@ -1,6 +1,7 @@ /** @file Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+Portions copyright (c) 2013, ARM Ltd. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this @@ -18,6 +19,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #endif +#include #include #include #include @@ -264,9 +266,12 @@ ScanSections32 ( 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. @@ -291,7 +296,6 @@ ScanSections32 ( // First text sections. // mCoffOffset = CoffAlign(mCoffOffset); - mTextOffset = mCoffOffset; SectionCount = 0; for (i = 0; i < mEhdr->e_shnum; i++) { Elf_Shdr *shdr = GetShdrByIndex(i); @@ -315,12 +319,26 @@ ScanSections32 ( (mEhdr->e_entry < shdr->sh_addr + shdr->sh_size)) { CoffEntry = 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 += 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); } diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/GenFw/Elf64Convert.c old mode 100644 new mode 100755 index 72d6cd1..713f8f7 --- 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 #include #endif +#include #include #include #include @@ -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); } -- 1.7.0.4