Sync EDKII BaseTools to BaseTools project r1928

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10234 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
lgao4 2010-03-12 10:54:01 +00:00
parent b7250b714a
commit 636f2be673
29 changed files with 262 additions and 134 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -131,6 +131,10 @@
"$(CC)" $(CC_FLAGS) -o ${dst} $(INC) ${src}
"$(SYMRENAME)" $(SYMRENAME_FLAGS) ${dst}
<Command.ARMGCC>
"$(CC)" $(CC_FLAGS) -o ${dst} $(INC) ${src}
[C-Header-File]
<InputFile>
*.h, *.H
@ -215,7 +219,7 @@
<Command.RVCT>
"$(SLINK)" $(SLINK_FLAGS) ${dst} --via $(OBJECT_FILES_LIST)
<Command.RVCTCYGWIN>
<Command.RVCTCYGWIN, Command.ARMGCC>
# $(OBJECT_FILES_LIST) has wrong paths for cygwin
"$(SLINK)" $(SLINK_FLAGS) ${dst} $(OBJECT_FILES)
@ -239,6 +243,9 @@
"$(DLINK)" -o ${dst} $(DLINK_FLAGS) -\( $(DLINK_SPATH) @$(STATIC_LIBRARY_FILES_LIST) -\) $(DLINK2_FLAGS)
"$(OBJCOPY)" $(OBJCOPY_FLAGS) ${dst}
<Command.ARMGCC>
"$(DLINK)" -o ${dst} $(DLINK_FLAGS) -( $(DLINK_SPATH) $(STATIC_LIBRARY_FILES) -) $(DLINK2_FLAGS)
<Command.RVCT>
"$(DLINK)" $(DLINK_FLAGS) -o ${dst} $(DLINK_SPATH) --via $(STATIC_LIBRARY_FILES_LIST) $(DLINK2_FLAGS)
@ -266,6 +273,9 @@
<Command.GCC>
"$(DLINK)" $(DLINK_FLAGS) -\( $(DLINK_SPATH) @$(STATIC_LIBRARY_FILES_LIST) -\) $(DLINK2_FLAGS)
<Command.ARMGCC>
"$(DLINK)" $(DLINK_FLAGS) -( $(DLINK_SPATH) $(STATIC_LIBRARY_FILES) -) $(DLINK2_FLAGS)
<Command.RVCT>
"$(DLINK)" $(DLINK_FLAGS) -o ${dst} $(DLINK_SPATH) --via $(STATIC_LIBRARY_FILES_LIST) $(DLINK2_FLAGS)
@ -284,7 +294,7 @@
<OutputFile>
$(DEBUG_DIR)(+)$(MODULE_NAME).efi
<Command.MSFT, Command.INTEL, Command.RVCT>
<Command.MSFT, Command.INTEL, Command.RVCT, Command.ARMGCC>
GenFw -e $(MODULE_TYPE) -o ${dst} ${src}
$(CP) ${dst} $(OUTPUT_DIR)
$(CP) ${dst} $(BIN_DIR)

@ -140,8 +140,8 @@ DEFINE IPHONE_TOOLS = /Developer/Platforms/iPhoneOS.platform/Develope
DEFINE RVCT31_TOOLS_PATH = c:/Program Files/ARM/RVCT/Programs/3.1/761/win_32-pentium
DEFINE RVCT31CYGWIN_TOOLS_PATH = /cygdrive/c/Program Files/ARM/RVCT/Programs/3.1/761/win_32-pentium
# Update to the location of the gcc executables
DEFINE ARMGCC_BIN = /
DEFINE SOURCERY_TOOLS = c:/Program Files/CodeSourcery/Sourcery G++ Lite/bin
DEFINE SOURCERY_CYGWIN_TOOLS = /cygdrive/c/Program Files/CodeSourcery/Sourcery G++ Lite/bin
####################################################################################
#
@ -1589,8 +1589,8 @@ DEFINE GCC44_ASM_FLAGS = DEF(GCC_ASM_FLAGS)
*_UNIXGCC_*_MAKE_PATH = make
*_UNIXGCC_*_ASL_PATH = DEF(UNIX_IASL_BIN)
*_UNIXGCC_IA32_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS)
*_UNIXGCC_X64_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS)
*_UNIXGCC_IA32_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS) --image-base=0
*_UNIXGCC_X64_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS) --image-base=0
*_UNIXGCC_IA32_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_ASLDLINK_FLAGS)
*_UNIXGCC_X64_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_ASLDLINK_FLAGS)
*_UNIXGCC_*_ASM_FLAGS = DEF(GCC_ASM_FLAGS)
@ -1717,8 +1717,8 @@ DEFINE GCC44_ASM_FLAGS = DEF(GCC_ASM_FLAGS)
*_CYGGCC_*_MAKE_PATH = DEF(MS_VS_BIN)\nmake.exe
*_CYGGCC_*_ASL_PATH = DEF(DEFAULT_WIN_ASL_BIN)
*_CYGGCC_IA32_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS)
*_CYGGCC_X64_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS)
*_CYGGCC_IA32_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS) --image-base=0
*_CYGGCC_X64_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS) --image-base=0
*_CYGGCC_IA32_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_ASLDLINK_FLAGS)
*_CYGGCC_X64_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_ASLDLINK_FLAGS)
*_CYGGCC_*_MAKE_FLAGS = /nologo
@ -1745,10 +1745,11 @@ DEFINE GCC44_ASM_FLAGS = DEF(GCC_ASM_FLAGS)
*_CYGGCC_IA32_ASLPP_PATH = DEF(CYGWIN_BINIA32)gcc
*_CYGGCC_IA32_ASLDLINK_PATH = DEF(CYGWIN_BINIA32)ld
*_CYGGCC_IA32_RC_PATH = DEF(CYGWIN_BINIA32)objcopy
*_CYGGCC_IA32_OBJECT_PATH = DEF(CYGWIN_BINIA32)objcopy
*_CYGGCC_IA32_OBJCOPY_PATH = DEF(CYGWIN_BINIA32)objcopy
*_CYGGCC_IA32_CC_FLAGS = DEF(GCC_IA32_CC_FLAGS)
*_CYGGCC_IA32_RC_FLAGS = DEF(GCC_IA32_RC_FLAGS)
*_CYGGCC_IA32_OBJCOPY_FLAGS =
##################
# X64 definitions
@ -1764,10 +1765,11 @@ DEFINE GCC44_ASM_FLAGS = DEF(GCC_ASM_FLAGS)
*_CYGGCC_X64_ASLPP_PATH = DEF(CYGWIN_BINX64)gcc
*_CYGGCC_X64_ASLDLINK_PATH = DEF(CYGWIN_BINX64)ld
*_CYGGCC_X64_RC_PATH = DEF(CYGWIN_BINX64)objcopy
*_CYGGCC_X64_OBJECT_PATH = DEF(CYGWIN_BINX64)objcopy
*_CYGGCC_X64_OBJCOPY_PATH = DEF(CYGWIN_BINX64)objcopy
*_CYGGCC_X64_CC_FLAGS = DEF(GCC_X64_CC_FLAGS)
*_CYGGCC_X64_RC_FLAGS = DEF(GCC_X64_RC_FLAGS)
*_CYGGCC_X64_OBJCOPY_FLAGS =
##################
# IPF definitions
@ -1784,7 +1786,6 @@ DEFINE GCC44_ASM_FLAGS = DEF(GCC_ASM_FLAGS)
*_CYGGCC_IPF_OBJCOPY_PATH = DEF(CYGWIN_BINIPF)objcopy
*_CYGGCC_IPF_SYMRENAME_PATH = DEF(CYGWIN_BINIPF)objcopy
*_CYGGCC_IPF_RC_PATH = DEF(CYGWIN_BINIPF)objcopy
*_CYGGCC_IPF_OBJECT_PATH = DEF(CYGWIN_BINIPF)objcopy
*_CYGGCC_IPF_CC_FLAGS = DEF(GCC_IPF_CC_FLAGS)
*_CYGGCC_IPF_DLINK_FLAGS = DEF(GCC_IPF_DLINK_FLAGS)
@ -2839,13 +2840,16 @@ RELEASE_RVCT31CYGWIN_ARM_CC_FLAGS = "$(CCPATH_FLAG)" $(ARCHCC_FLAGS) $(PLATFORM
####################################################################################
#
# ARM GCC (GCC 4.1.1, etc.)
# ARM GCC (www.codesourcery.com)
#
####################################################################################
# ARMGCC - ARM version of the GCC cross compiler
*_ARMGCC_*_*_FAMILY = GCC
*_ARMGCC_*_MAKE_PATH = make
*_ARMGCC_*_*_BUILDRULEFAMILY = ARMGCC
*_ARMGCC_*_MAKE_PATH = DEF(SOURCERY_TOOLS)/cs-make
*_ARMGCC_*_MAKE_FLAGS = --no-print-directory
##################
# ASL definitions
@ -2861,24 +2865,24 @@ RELEASE_RVCT31CYGWIN_ARM_CC_FLAGS = "$(CCPATH_FLAG)" $(ARCHCC_FLAGS) $(PLATFORM
# ARM definitions
##################
*_ARMGCC_ARM_ASLCC_PATH = DEF(ARMGCC_BIN)/arm-elf-gcc
*_ARMGCC_ARM_ASLDLINK_PATH = DEF(ARMGCC_BIN)/arm-elf-ld
*_ARMGCC_ARM_ASLPP_PATH = DEF(ARMGCC_BIN)/arm-elf-gcc
*_ARMGCC_ARM_ASLCC_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc
*_ARMGCC_ARM_ASLDLINK_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-ld
*_ARMGCC_ARM_ASLPP_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc
*_ARMGCC_ARM_CC_PATH = DEF(ARMGCC_BIN)/arm-elf-gcc
*_ARMGCC_ARM_SLINK_PATH = DEF(ARMGCC_BIN)/arm-elf-ar
*_ARMGCC_ARM_DLINK_PATH = DEF(ARMGCC_BIN)/arm-elf-ld
*_ARMGCC_ARM_ASM_PATH = DEF(ARMGCC_BIN)/arm-elf-as
*_ARMGCC_ARM_PP_PATH = DEF(ARMGCC_BIN)/arm-elf-gcc
*_ARMGCC_ARM_VFRPP_PATH = DEF(ARMGCC_BIN)/arm-elf-gcc
*_ARMGCC_ARM_CC_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc
*_ARMGCC_ARM_SLINK_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-ar
*_ARMGCC_ARM_DLINK_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-ld
*_ARMGCC_ARM_ASM_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-as
*_ARMGCC_ARM_PP_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc
*_ARMGCC_ARM_VFRPP_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc
#
# Use default values, or override in DSC file
#
*_ARMGCC_ARM_ARCHCC_FLAGS =
*_ARMGCC_ARM_ARCHASM_FLAGS =
*_ARMGCC_ARM_ARCHCC_FLAGS = -march=armv7-a -mthumb
*_ARMGCC_ARM_ARCHASM_FLAGS = -march=armv7-a
*_ARMGCC_ARM_ARCHDLINK_FLAGS =
*_ARMGCC_ARM_PLATFORM_FLAGS =
*_ARMGCC_ARM_PLATFORM_FLAGS = -march=armv7-a
DEBUG_ARMGCC_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) -mlittle-endian -g
RELEASE_ARMGCC_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) -mlittle-endian
@ -2886,11 +2890,12 @@ RELEASE_ARMGCC_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) -mlittle-endian
*_ARMGCC_ARM_PP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h
*_ARMGCC_ARM_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h
*_ARMGCC_ARM_MAKE_PATH = make
*_ARMGCC_ARM_SLINK_FLAGS = -r
*_ARMGCC_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) --emit-relocs --oformat=elf32-littlearm -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
# --gc-sections
*_ARMGCC_ARM_SLINK_FLAGS = -rc
*_ARMGCC_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) --oformat=elf32-littlearm -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
#
# Had to remove --emit-relocs to get compile working. Images don't work correctly (linked at 0, no relocations)
# --emit-relocs
#
DEBUG_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -mfpu=fpa -mlittle-endian -g -O2 -mabi=aapcs -mapcs -fno-short-enums -save-temps -combine -fsigned-char -fshort-wchar -fno-strict-aliasing -ffunction-sections -fdata-sections -Wall -Werror -Wno-missing-braces -fomit-frame-pointer -c -include AutoGen.h
RELEASE_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -mfpu=fpa -mlittle-endian -O2 -mabi=aapcs -mapcs -fno-short-enums -save-temps -combine -fsigned-char -fshort-wchar -fno-strict-aliasing -ffunction-sections -fdata-sections -Wall -Werror -Wno-missing-braces -fomit-frame-pointer -c -include AutoGen.h

@ -24,6 +24,8 @@ Abstract:
#ifndef __GNUC__
#include <windows.h>
#include <io.h>
#include <sys/types.h>
#include <sys/stat.h>
#endif
#include <stdio.h>
#include <stdlib.h>
@ -1034,14 +1036,20 @@ WriteSections(
- (SecOffset - SecShdr->sh_addr);
break;
default:
Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));
Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));
}
} else if (Ehdr->e_machine == EM_ARM) {
switch (ELF32_R_TYPE(Rel->r_info)) {
case R_ARM_RBASE: // No relocation - no action required
case R_ARM_PC24: // PC-relative relocations don't require modification
case R_ARM_XPC25: // PC-relative relocations don't require modification
// Thease are all PC-relative relocations and don't require modification
case R_ARM_PC24:
case R_ARM_XPC25:
case R_ARM_THM_PC22:
case R_ARM_THM_JUMP19:
case R_ARM_CALL:
break;
case R_ARM_ABS32:
case R_ARM_RABS32:
//
@ -1050,7 +1058,7 @@ WriteSections(
*(UINT32 *)Targ = *(UINT32 *)Targ - SymShdr->sh_addr + CoffSectionsOffset[Sym->st_shndx];
break;
default:
Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));
Error (NULL, 0, 3000, "Invalid", "WriteSections (): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));
}
}
}
@ -1124,7 +1132,7 @@ GetPhdrByIndex (
VOID
WriteRelocations(
WriteRelocations (
VOID
)
{
@ -1164,13 +1172,18 @@ WriteRelocations(
EFI_IMAGE_REL_BASED_HIGHLOW);
break;
default:
Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));
Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));
}
} else if (Ehdr->e_machine == EM_ARM) {
switch (ELF32_R_TYPE(Rel->r_info)) {
case R_ARM_RBASE:
case R_ARM_RBASE: // No relocation - no action required
// Thease are all PC-relative relocations and don't require modification
case R_ARM_PC24:
case R_ARM_XPC25:
case R_ARM_THM_PC22:
case R_ARM_THM_JUMP19:
case R_ARM_CALL:
break;
case R_ARM_ABS32:
case R_ARM_RABS32:
@ -1180,8 +1193,9 @@ WriteRelocations(
EFI_IMAGE_REL_BASED_HIGHLOW
);
break;
default:
Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));
default:
Error (NULL, 0, 3000, "Invalid", "WriteRelocations(): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));
}
} else {
Error (NULL, 0, 3000, "Not Supported", "This tool does not support relocations for ELF with e_machine %u (processor type).", (unsigned) Ehdr->e_machine);
@ -1217,6 +1231,9 @@ WriteRelocations(
case DT_RELENT:
RelElementSize = Dyn->d_un.d_val;
break;
default:
break;
}
Dyn++;
}
@ -1226,7 +1243,13 @@ WriteRelocations(
for (K = 0; K < RelSize; K += RelElementSize) {
Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + DynamicSegment->p_offset + RelOffset + K);
if (DynamicSegment->p_paddr == 0) {
// This seems to be how it works on armcc???? Have the email in to find out?
Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + DynamicSegment->p_offset + RelOffset + K);
} else {
// This is how it reads in the ELF specification
Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + RelOffset + K);
}
switch (ELF32_R_TYPE (Rel->r_info)) {
case R_ARM_RBASE:
@ -1242,7 +1265,8 @@ WriteRelocations(
CoffAddFixup (CoffSectionsOffset[ELF32_R_SYM (Rel->r_info)] + (Rel->r_offset - TargetSegment->p_vaddr), EFI_IMAGE_REL_BASED_HIGHLOW);
break;
default:
Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type.", mInImageName);
Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type %d.", mInImageName, ELF32_R_TYPE (Rel->r_info));
break;
}
}
break;
@ -1993,6 +2017,9 @@ Returns:
FILE *ReportFile;
CHAR8 *ReportFileName;
UINTN FileLen;
time_t InputFileTime;
time_t OutputFileTime;
struct stat Stat_Buf;
SetUtilityName (UTILITY_NAME);
@ -2038,6 +2065,8 @@ Returns:
HiiSectionHeader = NULL;
NewBaseAddress = 0;
NegativeAddr = FALSE;
InputFileTime = 0;
OutputFileTime = 0;
if (argc == 1) {
Error (NULL, 0, 1001, "Missing options", "No input options.");
@ -2434,6 +2463,14 @@ Returns:
if (OutImageName != NULL) {
fpOut = fopen (OutImageName, "rb");
if (fpOut != NULL) {
//
// Get Output file time stamp
//
fstat(fileno (fpOut), &Stat_Buf);
OutputFileTime = Stat_Buf.st_mtime;
//
// Get Output file data
//
OutputFileLength = _filelength (fileno (fpOut));
OutputFileBuffer = malloc (OutputFileLength);
if (OutputFileBuffer == NULL) {
@ -2460,6 +2497,14 @@ Returns:
Error (NULL, 0, 0001, "Error opening file", mInImageName);
goto Finish;
}
//
// Get Iutput file time stamp
//
fstat(fileno (fpIn), &Stat_Buf);
InputFileTime = Stat_Buf.st_mtime;
//
// Get Input file data
//
InputFileLength = _filelength (fileno (fpIn));
InputFileBuffer = malloc (InputFileLength);
if (InputFileBuffer == NULL) {
@ -3467,6 +3512,27 @@ Returns:
FileLength = FileLength + sizeof (EFI_TE_IMAGE_HEADER);
memcpy (FileBuffer, &TEImageHeader, sizeof (EFI_TE_IMAGE_HEADER));
VerboseMsg ("the size of output file is %u bytes", (unsigned) (FileLength));
} else {
//
// Following codes are to fix the objcopy's issue:
// objcopy in binutil 2.50.18 will set PE image's charactices to "RELOC_STRIPPED" if image has no ".reloc" section
// It cause issue for EFI image which has no ".reloc" sections.
// Following codes will be removed when objcopy in binutil fix this problem for PE image.
//
if ((PeHdr->Pe32.FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) != 0) {
if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
Optional32 = (EFI_IMAGE_OPTIONAL_HEADER32 *)&PeHdr->Pe32.OptionalHeader;
if (Optional32->ImageBase == 0) {
PeHdr->Pe32.FileHeader.Characteristics &= ~EFI_IMAGE_FILE_RELOCS_STRIPPED;
}
} else if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
Optional64 = (EFI_IMAGE_OPTIONAL_HEADER64 *)&PeHdr->Pe32.OptionalHeader;
if (Optional64->ImageBase == 0) {
PeHdr->Pe32.FileHeader.Characteristics &= ~EFI_IMAGE_FILE_RELOCS_STRIPPED;
}
}
}
}
WriteFile:
@ -3487,7 +3553,10 @@ WriteFile:
VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);
}
} else {
if ((FileLength != OutputFileLength) || (memcmp (FileBuffer, OutputFileBuffer, FileLength) != 0)) {
if ((OutputFileTime < InputFileTime) || (FileLength != OutputFileLength) || (memcmp (FileBuffer, OutputFileBuffer, FileLength) != 0)) {
//
// Update File when File is changed or File is old.
//
fpOut = fopen (OutImageName, "wb");
if (fpOut == NULL) {
Error (NULL, 0, 0001, "Error opening output file", OutImageName);

@ -597,6 +597,8 @@ typedef struct {
#define R_ARM_GOTPC 25 /* Add PC-relative GOT table address. */
#define R_ARM_GOT32 26 /* Add PC-relative GOT offset. */
#define R_ARM_PLT32 27 /* Add PC-relative PLT offset. */
#define R_ARM_CALL 28
#define R_ARM_THM_JUMP19 51
#define R_ARM_GNU_VTENTRY 100
#define R_ARM_GNU_VTINHERIT 101
#define R_ARM_RSBREL32 250

@ -1,7 +1,7 @@
## @file
# Create makefile for MS nmake and GNU make
#
# Copyright (c) 2007, Intel Corporation
# Copyright (c) 2007 - 2010, Intel Corporation
# 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 distribution. The full text of the license may be found at
@ -26,7 +26,7 @@ from BuildEngine import *
import Common.GlobalData as GlobalData
## Regular expression for finding header file inclusions
gIncludePattern = re.compile(r"^[ \t]*#[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n))*[ \t]*)*(?:[\"<][ \t]*)([\w.\\/]+)(?:[ \t]*[\">])", re.MULTILINE|re.UNICODE)
gIncludePattern = re.compile(r"^[ \t]*#?[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n))*[ \t]*)*(?:[\"<]?[ \t]*)([\w.\\/]+)(?:[ \t]*[\">]?)", re.MULTILINE|re.UNICODE)
## Regular expression for matching macro used in header file inclusion
gMacroPattern = re.compile("([_A-Z][_A-Z0-9]*)[ \t]*\((.+)\)", re.UNICODE)

@ -1,7 +1,7 @@
## @file
# This file is used to define each component of DSC file
#
# Copyright (c) 2007 ~ 2008, Intel Corporation
# Copyright (c) 2007 - 2010, Intel Corporation
# 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 distribution. The full text of the license may be found at
@ -989,10 +989,14 @@ class Dsc(DscObject):
#
elif PreviousIf[2] in (MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, Model):
List = PreviousIf[0].split(' ')
Value1 = List[0]
Value2 = List[1]
Value3 = List[2]
Value3 = SplitString(Value3)
Value1, Value2, Value3 = '', '==', '0'
if len(List) == 3:
Value1 = List[0]
Value2 = List[1]
Value3 = List[2]
Value3 = SplitString(Value3)
if len(List) == 1:
Value1 = List[0]
Model = PreviousIf[2]
self.TblDsc.Insert(Model, Value1, Value2, Value3, ArchList, BelongsToItem, self.FileID, PreviousIf[1], StartColumn, EndLine, EndColumn, Enabled)
#

@ -1760,8 +1760,8 @@ class FdfParser(object):
if not self.__GetNextHexNumber():
raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)
if len(self.__Token) > 4:
raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)
if len(self.__Token) > 18:
raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)
DataString = self.__Token
DataString += ","
@ -1792,8 +1792,8 @@ class FdfParser(object):
if not self.__GetNextHexNumber():
raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)
if len(self.__Token) > 4:
raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)
if len(self.__Token) > 18:
raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)
DataString = self.__Token
DataString += ","

@ -291,17 +291,17 @@ def QueryInfItem(Table, Model, BelongsToItem):
# @retval truple() A truple structure as (Family, ToolChain, Flag)
#
def GetBuildOption(String, File, LineNo = -1):
(Family, ToolChain, Flag) = ('', '', '')
if String.find(TAB_EQUAL_SPLIT) < 0:
RaiseParserError(String, 'BuildOptions', File, '[<Family>:]<ToolFlag>=Flag', LineNo)
(Family, ToolChain, Flag) = ('', '', '')
List = GetSplitValueList(String, TAB_EQUAL_SPLIT, MaxSplit = 1)
if List[0].find(':') > -1:
Family = List[0][ : List[0].find(':')].strip()
ToolChain = List[0][List[0].find(':') + 1 : ].strip()
else:
ToolChain = List[0].strip()
Flag = List[1].strip()
List = GetSplitValueList(String, TAB_EQUAL_SPLIT, MaxSplit = 1)
if List[0].find(':') > -1:
Family = List[0][ : List[0].find(':')].strip()
ToolChain = List[0][List[0].find(':') + 1 : ].strip()
else:
ToolChain = List[0].strip()
Flag = List[1].strip()
return (Family, ToolChain, Flag)
## Get Library Class

@ -1787,19 +1787,27 @@ class FdfParser:
if not self.__GetNextHexNumber():
raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)
if len(self.__Token) > 4:
raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)
if len(self.__Token) > 18:
raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)
DataString = self.__Token
DataString += ","
# convert hex string value to byte hex string array
AllString = self.__Token
AllStrLen = len (AllString)
DataString = ""
while AllStrLen > 4:
DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","
AllStrLen = AllStrLen - 2
DataString = DataString + AllString[:AllStrLen] + ","
while self.__IsToken(","):
if not self.__GetNextHexNumber():
raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)
if len(self.__Token) > 4:
raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)
DataString += self.__Token
DataString += ","
# byte value array
if len (self.__Token) <= 4:
while self.__IsToken(","):
if not self.__GetNextHexNumber():
raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)
if len(self.__Token) > 4:
raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)
DataString += self.__Token
DataString += ","
if not self.__IsToken( "}"):
raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)
@ -1819,18 +1827,27 @@ class FdfParser:
if not self.__GetNextHexNumber():
raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)
if len(self.__Token) > 4:
raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)
if len(self.__Token) > 18:
raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)
DataString = self.__Token
DataString += ","
# convert hex string value to byte hex string array
AllString = self.__Token
AllStrLen = len (AllString)
DataString = ""
while AllStrLen > 4:
DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","
AllStrLen = AllStrLen - 2
DataString = DataString + AllString[:AllStrLen] + ","
while self.__IsToken(","):
self.__GetNextHexNumber()
if len(self.__Token) > 4:
raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)
DataString += self.__Token
DataString += ","
# byte value array
if len (self.__Token) <= 4:
while self.__IsToken(","):
if not self.__GetNextHexNumber():
raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)
if len(self.__Token) > 4:
raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)
DataString += self.__Token
DataString += ","
if not self.__IsToken( "}"):
raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)

@ -221,7 +221,7 @@ class LibraryReport(object):
EdkIILibInfo += " C = " + LibConstructor
LibDestructor = " ".join(LibraryItem[3])
if LibDestructor:
EdkIILibInfo += " D = " + LibConstructor
EdkIILibInfo += " D = " + LibDestructor
LibDepex = " ".join(LibraryItem[4])
if LibDepex:
EdkIILibInfo += " Depex = " + LibDepex
@ -255,7 +255,8 @@ class DepexReport(object):
ModuleType = M.ModuleType
if not ModuleType:
ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")
if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE"]:
if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE", "SMM_CORE", "UEFI_APPLICATION"]:
return
for Source in M.SourceFileList:
@ -404,17 +405,18 @@ class ModuleReport(object):
self.Size = 0
self.BuildTimeStamp = None
self.DriverType = ""
ModuleType = M.ModuleType
if not ModuleType:
ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")
#
# If a module complies to PI 1.1, promote Module type to "SMM_DRIVER"
#
if ModuleType == "DXE_SMM_DRIVER":
PiSpec = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000")
if int(PiSpec, 0) >= 0x0001000A:
ModuleType = "SMM_DRIVER"
self.DriverType = gDriverTypeMap.get(ModuleType, "")
if not M.IsLibrary:
ModuleType = M.ModuleType
if not ModuleType:
ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")
#
# If a module complies to PI 1.1, promote Module type to "SMM_DRIVER"
#
if ModuleType == "DXE_SMM_DRIVER":
PiSpec = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000")
if int(PiSpec, 0) >= 0x0001000A:
ModuleType = "SMM_DRIVER"
self.DriverType = gDriverTypeMap.get(ModuleType, "0x2 (FREE_FORM)")
self.UefiSpecVersion = M.Module.Specification.get("UEFI_SPECIFICATION_VERSION", "")
self.PiSpecVersion = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "")
self.PciDeviceId = M.Module.Defines.get("PCI_DEVICE_ID", "")
@ -1310,9 +1312,11 @@ class PlatformReport(object):
self.ModuleReportList = []
if MaList != None:
self._IsModuleBuild = True
for Ma in MaList:
self.ModuleReportList.append(ModuleReport(Ma, ReportType))
else:
self._IsModuleBuild = False
for Pa in Wa.AutoGenObjectList:
for ModuleKey in Pa.Platform.Modules:
self.ModuleReportList.append(ModuleReport(Pa.Platform.Modules[ModuleKey].M, ReportType))
@ -1343,18 +1347,20 @@ class PlatformReport(object):
FileWrite(File, "Build Duration: %s" % BuildDuration)
FileWrite(File, "Report Content: %s" % ", ".join(ReportType))
if "PCD" in ReportType:
self.PcdReport.GenerateReport(File, None)
if "FLASH" in ReportType:
for FdReportListItem in self.FdReportList:
FdReportListItem.GenerateReport(File)
if not self._IsModuleBuild:
if "PCD" in ReportType:
self.PcdReport.GenerateReport(File, None)
if "FLASH" in ReportType:
for FdReportListItem in self.FdReportList:
FdReportListItem.GenerateReport(File)
for ModuleReportItem in self.ModuleReportList:
ModuleReportItem.GenerateReport(File, self.PcdReport, self.PredictionReport, ReportType)
if "EXECUTION_ORDER" in ReportType:
self.PredictionReport.GenerateReport(File, None)
if not self._IsModuleBuild:
if "EXECUTION_ORDER" in ReportType:
self.PredictionReport.GenerateReport(File, None)
## BuildReport class
#
@ -1422,7 +1428,7 @@ class BuildReport(object):
EdkLogger.error("BuildReport", CODE_ERROR, "Unknown fatal error when generating build report", ExtraData=self.ReportFile, RaiseError=False)
EdkLogger.quiet("(Python %s on %s\n%s)" % (platform.python_version(), sys.platform, traceback.format_exc()))
File.close()
# This acts like the main() function for the script, unless it is 'import'ed into another script.
if __name__ == '__main__':
pass

@ -1090,9 +1090,10 @@ class Build():
## Collect MAP information of all FVs
#
def _CollectFvMapBuffer (self, MapBuffer, Wa):
def _CollectFvMapBuffer (self, MapBuffer, Wa, ModuleList):
if self.Fdf != '':
# First get the XIP base address for FV map file.
GuidPattern = re.compile("[-a-fA-F0-9]+")
for FvName in Wa.FdfProfile.FvDict.keys():
FvMapBuffer = os.path.join(Wa.FvDir, FvName + '.Fv.map')
if not os.path.exists(FvMapBuffer):
@ -1103,7 +1104,16 @@ class Build():
FvMap.readline()
FvMap.readline()
FvMap.readline()
MapBuffer.write(FvMap.read())
for Line in FvMap:
MatchGuid = GuidPattern.match(Line)
if MatchGuid != None:
#
# Replace GUID with module name
#
GuidString = MatchGuid.group()
if GuidString.upper() in ModuleList:
Line = Line.replace(GuidString, ModuleList[GuidString.upper()].Name)
MapBuffer.write('%s' % (Line))
FvMap.close()
## Collect MAP information of all modules
@ -1124,7 +1134,8 @@ class Build():
IsIpfPlatform = False
if 'IPF' in self.ArchList:
IsIpfPlatform = True
for Module in ModuleList:
for ModuleGuid in ModuleList:
Module = ModuleList[ModuleGuid]
GlobalData.gProcessingFile = "%s [%s, %s, %s]" % (Module.MetaFile, Module.Arch, Module.ToolChain, Module.BuildTarget)
OutputImageFile = ''
@ -1259,7 +1270,8 @@ class Build():
#
SaveFileOnChange(MapFilePath, MapBuffer.getvalue(), False)
MapBuffer.close()
sys.stdout.write ("\nLoad Module At Fix Address Map file saved to %s\n" %(MapFilePath))
if self.LoadFixAddress != 0:
sys.stdout.write ("\nLoad Module At Fix Address Map file saved to %s\n" %(MapFilePath))
sys.stdout.flush()
## Build active platform for different build targets and different tool chains
@ -1286,7 +1298,7 @@ class Build():
self._Build(self.Target, Wa)
# Create MAP file when Load Fix Address is enabled.
if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0:
if self.Target in ["", "all", "fds"]:
for Arch in self.ArchList:
#
# Check whether the set fix address is above 4G for 32bit image.
@ -1296,19 +1308,20 @@ class Build():
#
# Get Module List
#
ModuleList = []
ModuleList = {}
for Pa in Wa.AutoGenObjectList:
for Ma in Pa.ModuleAutoGenList:
if Ma == None:
continue
if not Ma.IsLibrary:
ModuleList.append (Ma)
ModuleList[Ma.Guid.upper()] = Ma
MapBuffer = StringIO('')
#
# Rebase module to the preferred memory address before GenFds
#
self._CollectModuleMapBuffer(MapBuffer, ModuleList)
if self.LoadFixAddress != 0:
#
# Rebase module to the preferred memory address before GenFds
#
self._CollectModuleMapBuffer(MapBuffer, ModuleList)
if self.Fdf != '':
#
# create FDS again for the updated EFI image
@ -1317,7 +1330,7 @@ class Build():
#
# Create MAP file for all platform FVs after GenFds.
#
self._CollectFvMapBuffer(MapBuffer, Wa)
self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)
#
# Save MAP buffer into MAP file.
#
@ -1367,7 +1380,7 @@ class Build():
ExtraData=self.ModuleFile
)
# Create MAP file when Load Fix Address is enabled.
if self.LoadFixAddress != 0 and self.Target == "fds" and self.Fdf != '':
if self.Target == "fds" and self.Fdf != '':
for Arch in self.ArchList:
#
# Check whether the set fix address is above 4G for 32bit image.
@ -1377,27 +1390,28 @@ class Build():
#
# Get Module List
#
ModuleList = []
ModuleList = {}
for Pa in Wa.AutoGenObjectList:
for Ma in Pa.ModuleAutoGenList:
if Ma == None:
continue
if not Ma.IsLibrary:
ModuleList.append (Ma)
ModuleList[Ma.Guid.upper()] = Ma
MapBuffer = StringIO('')
#
# Rebase module to the preferred memory address before GenFds
#
self._CollectModuleMapBuffer(MapBuffer, ModuleList)
#
# create FDS again for the updated EFI image
#
self._Build("fds", Wa)
if self.LoadFixAddress != 0:
#
# Rebase module to the preferred memory address before GenFds
#
self._CollectModuleMapBuffer(MapBuffer, ModuleList)
#
# create FDS again for the updated EFI image
#
self._Build("fds", Wa)
#
# Create MAP file for all platform FVs after GenFds.
#
self._CollectFvMapBuffer(MapBuffer, Wa)
self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)
#
# Save MAP buffer into MAP file.
#
@ -1483,7 +1497,7 @@ class Build():
EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)
# Create MAP file when Load Fix Address is enabled.
if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0:
if self.Target in ["", "all", "fds"]:
for Arch in self.ArchList:
#
# Check whether the set fix address is above 4G for 32bit image.
@ -1493,30 +1507,31 @@ class Build():
#
# Get Module List
#
ModuleList = []
ModuleList = {}
for Pa in Wa.AutoGenObjectList:
for Ma in Pa.ModuleAutoGenList:
if Ma == None:
continue
if not Ma.IsLibrary:
ModuleList.append (Ma)
ModuleList[Ma.Guid.upper()] = Ma
#
# Rebase module to the preferred memory address before GenFds
#
MapBuffer = StringIO('')
self._CollectModuleMapBuffer(MapBuffer, ModuleList)
if self.LoadFixAddress != 0:
self._CollectModuleMapBuffer(MapBuffer, ModuleList)
# Generate FD image if there's a FDF file found
if self.Fdf != '' and self.Target in ["", "all", "fds"]:
LaunchCommand(Wa.BuildCommand + ["fds"], Wa.MakeFileDir)
# Create MAP file for all platform FV after GenFds
if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0:
if self.Target in ["", "all", "fds"]:
if self.Fdf != '':
#
# Create MAP file for all platform FVs after GenFds.
#
self._CollectFvMapBuffer(MapBuffer, Wa)
self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)
#
# Save MAP buffer into MAP file.
#