2013-09-04 12:30:27 +02:00
|
|
|
From 7686eed1a9ed96791cfa65ec5b2f5fdaca538e53 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Olivier Martin <olivier.martin@arm.com>
|
|
|
|
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 <olivier.martin@arm.com>
|
|
|
|
---
|
|
|
|
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.<BR>
|
|
|
|
+Portions copyright (c) 2013, ARM Ltd. All rights reserved.<BR>
|
|
|
|
|
|
|
|
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 <windows.h>
|
|
|
|
#include <io.h>
|
|
|
|
#endif
|
|
|
|
+#include <assert.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
@@ -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 <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);
|
|
|
|
}
|
|
|
|
--
|
|
|
|
1.7.0.4
|
|
|
|
|