- (SecOffset - SecShdr->sh_addr);\r
break;\r
default:\r
- Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));\r
+ Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));\r
}\r
} else if (Ehdr->e_machine == EM_ARM) {\r
switch (ELF32_R_TYPE(Rel->r_info)) {\r
case R_ARM_RBASE: // No relocation - no action required\r
- case R_ARM_PC24: // PC-relative relocations don't require modification\r
- case R_ARM_XPC25: // PC-relative relocations don't require modification\r
+ \r
+ // Thease are all PC-relative relocations and don't require modification\r
+ case R_ARM_PC24: \r
+ case R_ARM_XPC25: \r
+ case R_ARM_THM_PC22:\r
+ case R_ARM_THM_JUMP19:\r
+ case R_ARM_CALL:\r
break;\r
+\r
case R_ARM_ABS32:\r
case R_ARM_RABS32:\r
//\r
*(UINT32 *)Targ = *(UINT32 *)Targ - SymShdr->sh_addr + CoffSectionsOffset[Sym->st_shndx];\r
break;\r
default:\r
- Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));\r
+ Error (NULL, 0, 3000, "Invalid", "WriteSections (): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));\r
}\r
}\r
}\r
\r
\r
VOID\r
-WriteRelocations(\r
+WriteRelocations (\r
VOID\r
)\r
{\r
UINT8 *Targ;\r
Elf32_Phdr *DynamicSegment;\r
Elf32_Phdr *TargetSegment;\r
- static int ErrorCount = 0;\r
\r
for (Index = 0, FoundRelocations = FALSE; Index < Ehdr->e_shnum; Index++) {\r
Elf_Shdr *RelShdr = GetShdrByIndex(Index);\r
EFI_IMAGE_REL_BASED_HIGHLOW);\r
break;\r
default:\r
- Error (NULL, 0, 3000, "Invalid", "%s unkown relocation %x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));\r
+ Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));\r
}\r
} else if (Ehdr->e_machine == EM_ARM) {\r
switch (ELF32_R_TYPE(Rel->r_info)) {\r
- case R_ARM_RBASE:\r
+ case R_ARM_RBASE: // No relocation - no action required\r
+ \r
+ // Thease are all PC-relative relocations and don't require modification\r
case R_ARM_PC24:\r
case R_ARM_XPC25:\r
+ case R_ARM_THM_PC22:\r
+ case R_ARM_THM_JUMP19:\r
+ case R_ARM_CALL:\r
break;\r
case R_ARM_ABS32:\r
case R_ARM_RABS32:\r
EFI_IMAGE_REL_BASED_HIGHLOW\r
);\r
break;\r
- \r
- case R_ARM_CALL:\r
- case R_ARM_THM_MOVW_ABS_NC:\r
- case R_ARM_THM_MOVT_ABS:\r
- if (ErrorCount++ == 0) {\r
- Error (NULL, 0, 3000, "Invalid", "www.codesourcery.com ELF relocations not yet implemented!!!! Bad Image", mInImageName);\r
- }\r
- break;\r
\r
- default:\r
- Error (NULL, 0, 3000, "Invalid", "%s unkown relocation %x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));\r
+ default:\r
+ Error (NULL, 0, 3000, "Invalid", "WriteRelocations(): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));\r
}\r
} else {\r
Error (NULL, 0, 3000, "Not Supported", "This tool does not support relocations for ELF with e_machine %u (processor type).", (unsigned) Ehdr->e_machine);\r
case DT_RELENT:\r
RelElementSize = Dyn->d_un.d_val;\r
break;\r
+\r
+ default:\r
+ break;\r
}\r
Dyn++;\r
}\r
\r
for (K = 0; K < RelSize; K += RelElementSize) {\r
\r
- Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + DynamicSegment->p_offset + RelOffset + K);\r
+ if (DynamicSegment->p_paddr == 0) {\r
+ // This seems to be how it works on armcc???? Have the email in to find out?\r
+ Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + DynamicSegment->p_offset + RelOffset + K);\r
+ } else {\r
+ // This is how it reads in the ELF specification\r
+ Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + RelOffset + K);\r
+ }\r
\r
switch (ELF32_R_TYPE (Rel->r_info)) {\r
case R_ARM_RBASE:\r
CoffAddFixup (CoffSectionsOffset[ELF32_R_SYM (Rel->r_info)] + (Rel->r_offset - TargetSegment->p_vaddr), EFI_IMAGE_REL_BASED_HIGHLOW);\r
break;\r
default:\r
- Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type.", mInImageName);\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
break;\r