UINT32 Num\r
)\r
{\r
- if (Num >= mEhdr->e_shnum)\r
- return NULL;\r
+ if (Num >= mEhdr->e_shnum) {\r
+ Error (NULL, 0, 3000, "Invalid", "GetShdrByIndex: Index %u is too high.", Num);\r
+ exit(EXIT_FAILURE);\r
+ }\r
+\r
return (Elf_Shdr*)((UINT8*)mShdrBase + Num * mEhdr->e_shentsize);\r
}\r
\r
return (BOOLEAN) (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE);\r
}\r
\r
+STATIC\r
+BOOLEAN\r
+IsStrtabShdr (\r
+ Elf_Shdr *Shdr\r
+ )\r
+{\r
+ Elf_Shdr *Namedr = GetShdrByIndex(mEhdr->e_shstrndx);\r
+\r
+ return (BOOLEAN) (strcmp((CHAR8*)mEhdr + Namedr->sh_offset + Shdr->sh_name, ELF_STRTAB_SECTION_NAME) == 0);\r
+}\r
+\r
+STATIC\r
+Elf_Shdr *\r
+FindStrtabShdr (\r
+ VOID\r
+ )\r
+{\r
+ UINT32 i;\r
+ for (i = 0; i < mEhdr->e_shnum; i++) {\r
+ Elf_Shdr *shdr = GetShdrByIndex(i);\r
+ if (IsStrtabShdr(shdr)) {\r
+ return shdr;\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
+\r
+STATIC\r
+const UINT8 *\r
+GetSymName (\r
+ Elf_Sym *Sym\r
+ )\r
+{\r
+ if (Sym->st_name == 0) {\r
+ return NULL;\r
+ }\r
+\r
+ Elf_Shdr *StrtabShdr = FindStrtabShdr();\r
+ if (StrtabShdr == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ assert(Sym->st_name < StrtabShdr->sh_size);\r
+\r
+ return (UINT8*)mEhdr + StrtabShdr->sh_offset + Sym->st_name;\r
+}\r
+\r
//\r
// Elf functions interface implementation\r
//\r
// header location.\r
//\r
if (Sym->st_shndx == SHN_UNDEF\r
- || Sym->st_shndx == SHN_ABS\r
- || Sym->st_shndx > mEhdr->e_shnum) {\r
- Error (NULL, 0, 3000, "Invalid", "%s bad symbol definition.", mInImageName);\r
+ || Sym->st_shndx >= mEhdr->e_shnum) {\r
+ const UINT8 *SymName = GetSymName(Sym);\r
+ if (SymName == NULL) {\r
+ SymName = (const UINT8 *)"<unknown>";\r
+ }\r
+\r
+ Error (NULL, 0, 3000, "Invalid",\r
+ "%s: Bad definition for symbol '%s'@%p or unsupported symbol type. "\r
+ "For example, absolute and undefined symbols are not supported.",\r
+ mInImageName, SymName, Sym->st_value);\r
+\r
+ exit(EXIT_FAILURE);\r
}\r
SymShdr = GetShdrByIndex(Sym->st_shndx);\r
\r
case R_AARCH64_LD_PREL_LO19:\r
case R_AARCH64_CALL26:\r
case R_AARCH64_JUMP26:\r
+ case R_AARCH64_PREL64:\r
+ case R_AARCH64_PREL32:\r
+ case R_AARCH64_PREL16:\r
//\r
// The GCC toolchains (i.e., binutils) may corrupt section relative\r
// relocations when emitting relocation sections into fully linked\r
\r
switch (ELF_R_TYPE(Rel->r_info)) {\r
case R_AARCH64_ADR_PREL_LO21:\r
- break;\r
-\r
case R_AARCH64_CONDBR19:\r
- break;\r
-\r
case R_AARCH64_LD_PREL_LO19:\r
- break;\r
-\r
case R_AARCH64_CALL26:\r
- break;\r
-\r
case R_AARCH64_JUMP26:\r
- break;\r
-\r
+ case R_AARCH64_PREL64:\r
+ case R_AARCH64_PREL32:\r
+ case R_AARCH64_PREL16:\r
case R_AARCH64_ADR_PREL_PG_HI21:\r
case R_AARCH64_ADD_ABS_LO12_NC:\r
case R_AARCH64_LDST8_ABS_LO12_NC:\r
case R_AARCH64_LDST32_ABS_LO12_NC:\r
case R_AARCH64_LDST64_ABS_LO12_NC:\r
case R_AARCH64_LDST128_ABS_LO12_NC:\r
+ //\r
+ // No fixups are required for relative relocations, provided that\r
+ // the relative offsets between sections have been preserved in\r
+ // the ELF to PE/COFF conversion. We have already asserted that\r
+ // this is the case in WriteSections64 ().\r
+ //\r
break;\r
\r
case R_AARCH64_ABS64:\r