/** @file\r
Elf32 Convert solution\r
\r
-Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
Portions copyright (c) 2013, ARM Ltd. All rights reserved.<BR>\r
\r
This program and the accompanying materials are licensed and made available\r
//\r
// Initialize data pointer and structures.\r
//\r
- mEhdr = (Elf_Ehdr*) FileBuffer; \r
+ mEhdr = (Elf_Ehdr*) FileBuffer;\r
\r
//\r
// Check the ELF32 specific header information.\r
if (mEhdr->e_ident[EI_DATA] != ELFDATA2LSB) {\r
Error (NULL, 0, 3000, "Unsupported", "ELF EI_DATA not ELFDATA2LSB");\r
return FALSE;\r
- } \r
+ }\r
if ((mEhdr->e_type != ET_EXEC) && (mEhdr->e_type != ET_DYN)) {\r
Error (NULL, 0, 3000, "Unsupported", "ELF e_type not ET_EXEC or ET_DYN");\r
return FALSE;\r
}\r
- if (!((mEhdr->e_machine == EM_386) || (mEhdr->e_machine == EM_ARM))) { \r
+ if (!((mEhdr->e_machine == EM_386) || (mEhdr->e_machine == EM_ARM))) {\r
Error (NULL, 0, 3000, "Unsupported", "ELF e_machine not EM_386 or EM_ARM");\r
return FALSE;\r
}\r
Error (NULL, 0, 3000, "Unsupported", "ELF e_version (%u) not EV_CURRENT (%d)", (unsigned) mEhdr->e_version, EV_CURRENT);\r
return FALSE;\r
}\r
- \r
+\r
//\r
// Update section header pointers\r
//\r
mShdrBase = (Elf_Shdr *)((UINT8 *)mEhdr + mEhdr->e_shoff);\r
mPhdrBase = (Elf_Phdr *)((UINT8 *)mEhdr + mEhdr->e_phoff);\r
- \r
+\r
//\r
// Create COFF Section offset buffer and zero.\r
//\r
}\r
}\r
\r
+ //\r
+ // Check if mCoffAlignment is larger than MAX_COFF_ALIGNMENT\r
+ //\r
+ if (mCoffAlignment > MAX_COFF_ALIGNMENT) {\r
+ Error (NULL, 0, 3000, "Invalid", "Section alignment is larger than MAX_COFF_ALIGNMENT.");\r
+ assert (FALSE);\r
+ }\r
+\r
//\r
// Move the PE/COFF header right before the first section. This will help us\r
// save space when converting to TE.\r
switch (Shdr->sh_type) {\r
case SHT_PROGBITS:\r
/* Copy. */\r
+ if (Shdr->sh_offset + Shdr->sh_size > mFileBufferSize) {\r
+ return FALSE;\r
+ }\r
memcpy(mCoffFile + mCoffSectionsOffset[Idx],\r
(UINT8*)mEhdr + Shdr->sh_offset,\r
Shdr->sh_size);\r
if ((RelShdr->sh_type != SHT_REL) && (RelShdr->sh_type != SHT_RELA)) {\r
continue;\r
}\r
- \r
+\r
//\r
// Relocation section found. Now extract section information that the relocations\r
// apply to in the ELF data and the new COFF data.\r
//\r
SecShdr = GetShdrByIndex(RelShdr->sh_info);\r
SecOffset = mCoffSectionsOffset[RelShdr->sh_info];\r
- \r
+\r
//\r
// Only process relocations for the current filter type.\r
//\r
if (RelShdr->sh_type == SHT_REL && (*Filter)(SecShdr)) {\r
UINT32 RelOffset;\r
- \r
+\r
//\r
// Determine the symbol table referenced by the relocation data.\r
//\r
// Set pointer to relocation entry\r
//\r
Elf_Rel *Rel = (Elf_Rel *)((UINT8*)mEhdr + RelShdr->sh_offset + RelOffset);\r
- \r
+\r
//\r
// Set pointer to symbol table entry associated with the relocation entry.\r
//\r
Elf_Sym *Sym = (Elf_Sym *)(Symtab + ELF_R_SYM(Rel->r_info) * SymtabShdr->sh_entsize);\r
- \r
+\r
Elf_Shdr *SymShdr;\r
UINT8 *Targ;\r
UINT16 Address;\r
\r
//\r
- // Check section header index found in symbol table and get the section \r
+ // Check section header index found in symbol table and get the section\r
// header location.\r
//\r
if (Sym->st_shndx == SHN_UNDEF\r
//\r
// Convert the relocation data to a pointer into the coff file.\r
//\r
- // Note: \r
+ // Note:\r
// r_offset is the virtual address of the storage unit to be relocated.\r
// sh_addr is the virtual address for the base of the section.\r
//\r
case R_ARM_THM_JUMP19:\r
case R_ARM_CALL:\r
case R_ARM_JMP24:\r
- case R_ARM_THM_JUMP24: \r
- case R_ARM_PREL31: \r
- case R_ARM_MOVW_PREL_NC: \r
+ case R_ARM_THM_JUMP24:\r
+ case R_ARM_PREL31:\r
+ case R_ARM_MOVW_PREL_NC:\r
case R_ARM_MOVT_PREL:\r
case R_ARM_THM_MOVW_PREL_NC:\r
case R_ARM_THM_MOVT_PREL:\r
for (RelIdx = 0; RelIdx < RelShdr->sh_size; RelIdx += RelShdr->sh_entsize) {\r
Rel = (Elf_Rel *)((UINT8*)mEhdr + RelShdr->sh_offset + RelIdx);\r
\r
- if (mEhdr->e_machine == EM_386) { \r
+ if (mEhdr->e_machine == EM_386) {\r
switch (ELF_R_TYPE(Rel->r_info)) {\r
case R_386_NONE:\r
case R_386_PC32:\r
case R_ARM_THM_JUMP19:\r
case R_ARM_CALL:\r
case R_ARM_JMP24:\r
- case R_ARM_THM_JUMP24: \r
- case R_ARM_PREL31: \r
- case R_ARM_MOVW_PREL_NC: \r
+ case R_ARM_THM_JUMP24:\r
+ case R_ARM_PREL31:\r
+ case R_ARM_MOVW_PREL_NC:\r
case R_ARM_MOVT_PREL:\r
case R_ARM_THM_MOVW_PREL_NC:\r
case R_ARM_THM_MOVT_PREL:\r
case R_ARM_RABS32:\r
CoffAddFixup (Rel->r_offset, EFI_IMAGE_REL_BASED_HIGHLOW);\r
break;\r
- \r
+\r
default:\r
Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type %d.", mInImageName, ELF32_R_TYPE (Rel->r_info));\r
break;\r
)\r
{\r
EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr;\r
- \r
+\r
//\r
// Set image size\r
//\r