Yes. It should related to PIC/PIE code. I will correct my commit log later. Thank you let me know it.
Steven Shi Intel\SSG\STO\UEFI Firmware Tel: +86 021-61166522 iNet: 821-6522 > -----Original Message----- > From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] > Sent: Wednesday, June 29, 2016 10:42 PM > To: Shi, Steven <steven....@intel.com> > Cc: edk2-devel-01 <edk2-devel@lists.01.org>; Gao, Liming > <liming....@intel.com>; Kinney, Michael D <michael.d.kin...@intel.com>; > af...@apple.com > Subject: Re: [edk2] [PATCH 2/7] BaseTools: Add missing Elf relocation type > for LTO build > > On 29 June 2016 at 15:59, Shi, Steven <steven....@intel.com> wrote: > > Ok, will separate it. Thank you to let me know it. > > > > > BTW, your commit log suggests that these relocation types are somehow > related to LTO, but I think they are more related to PIC/PIE code, > right? So even if you disable LTO, you may encounter these relocation > types when using the new toolchain definitions? > > > >> -----Original Message----- > >> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] > >> Sent: Wednesday, June 29, 2016 9:30 PM > >> To: Shi, Steven <steven....@intel.com> > >> Cc: edk2-devel-01 <edk2-devel@lists.01.org>; Gao, Liming > >> <liming....@intel.com>; Kinney, Michael D > <michael.d.kin...@intel.com>; > >> af...@apple.com > >> Subject: Re: [edk2] [PATCH 2/7] BaseTools: Add missing Elf relocation > type > >> for LTO build > >> > >> On 28 June 2016 at 17:18, Shi, Steven <steven....@intel.com> wrote: > >> > Add support to convert missing Elf relocation types > >> > (R_X86_64_PLT32, R_X86_64_GOTPCREL, R_X86_64_REX_GOTPCRELX) > >> > to PeCoff, which are required by LTO image. > >> > > >> > >> Could you please put the changes that affect other architectures in a > >> separate patch? > >> The commit log suggests that only X64 is affected, but the patch > >> touches other things as well. > >> > >> > Contributed-under: TianoCore Contribution Agreement 1.0 > >> > Signed-off-by: Steven Shi <steven....@intel.com> > >> > --- > >> > BaseTools/Source/C/GenFw/Elf64Convert.c | 98 > >> ++++++++++++++++++++++++++++----- > >> > BaseTools/Source/C/GenFw/elf_common.h | 2 +- > >> > 2 files changed, 86 insertions(+), 14 deletions(-) > >> > mode change 100644 => 100755 > >> BaseTools/Source/C/GenFw/Elf64Convert.c > >> > mode change 100644 => 100755 > >> BaseTools/Source/C/GenFw/elf_common.h > >> > > >> > diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c > >> b/BaseTools/Source/C/GenFw/Elf64Convert.c > >> > old mode 100644 > >> > new mode 100755 > >> > index 024a2a0..205360c > >> > --- a/BaseTools/Source/C/GenFw/Elf64Convert.c > >> > +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c > >> > @@ -75,7 +75,7 @@ CleanUp64 ( > >> > ); > >> > > >> > // > >> > -// Rename ELF32 strucutres to common names to help when porting to > >> ELF64. > >> > +// Rename ELF32 structures to common names to help when porting to > >> ELF64. > >> > // > >> > typedef Elf64_Shdr Elf_Shdr; > >> > typedef Elf64_Ehdr Elf_Ehdr; > >> > @@ -233,7 +233,7 @@ IsTextShdr ( > >> > Elf_Shdr *Shdr > >> > ) > >> > { > >> > - return (BOOLEAN) ((Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == > >> SHF_ALLOC); > >> > + return (BOOLEAN) ((Shdr->sh_flags & (SHF_EXECINSTR | SHF_WRITE | > >> SHF_ALLOC)) == (SHF_EXECINSTR | SHF_ALLOC)); > >> > } > >> > > >> > STATIC > >> > @@ -256,7 +256,7 @@ IsDataShdr ( > >> > if (IsHiiRsrcShdr(Shdr)) { > >> > return FALSE; > >> > } > >> > - return (BOOLEAN) (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == > >> (SHF_ALLOC | SHF_WRITE); > >> > + return (BOOLEAN) (Shdr->sh_flags & (SHF_EXECINSTR | SHF_WRITE | > >> SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE); > >> > } > >> > > >> > STATIC > >> > @@ -661,9 +661,9 @@ WriteSections64 ( > >> > > >> > default: > >> > // > >> > - // Ignore for unkown section type. > >> > + // Ignore for unknown section type. > >> > // > >> > - VerboseMsg ("%s unknown section type %x. We directly copy this > >> section into Coff file", mInImageName, (unsigned)Shdr->sh_type); > >> > + VerboseMsg ("%s unknown section type %x. We directly ignore > this > >> section and NOT copy into Coff file", mInImageName, (unsigned)Shdr- > >> >sh_type); > >> > break; > >> > } > >> > } > >> > @@ -763,24 +763,24 @@ WriteSections64 ( > >> > // Absolute relocation. > >> > // > >> > VerboseMsg ("R_X86_64_64"); > >> > - VerboseMsg ("Offset: 0x%08X, Addend: 0x%016LX", > >> > - (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), > >> > + VerboseMsg ("Offset: 0x%08X, Addend: 0x%016LX", > >> > + (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), > >> > *(UINT64 *)Targ); > >> > *(UINT64 *)Targ = *(UINT64 *)Targ - SymShdr->sh_addr + > >> mCoffSectionsOffset[Sym->st_shndx]; > >> > VerboseMsg ("Relocation: 0x%016LX", *(UINT64*)Targ); > >> > break; > >> > case R_X86_64_32: > >> > VerboseMsg ("R_X86_64_32"); > >> > - VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", > >> > - (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), > >> > + VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", > >> > + (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), > >> > *(UINT32 *)Targ); > >> > *(UINT32 *)Targ = (UINT32)((UINT64)(*(UINT32 *)Targ) - > SymShdr- > >> >sh_addr + mCoffSectionsOffset[Sym->st_shndx]); > >> > VerboseMsg ("Relocation: 0x%08X", *(UINT32*)Targ); > >> > break; > >> > case R_X86_64_32S: > >> > VerboseMsg ("R_X86_64_32S"); > >> > - VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", > >> > - (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), > >> > + VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", > >> > + (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), > >> > *(UINT32 *)Targ); > >> > *(INT32 *)Targ = (INT32)((INT64)(*(INT32 *)Targ) - SymShdr- > >> >sh_addr + mCoffSectionsOffset[Sym->st_shndx]); > >> > VerboseMsg ("Relocation: 0x%08X", *(UINT32*)Targ); > >> > @@ -790,14 +790,34 @@ WriteSections64 ( > >> > // Relative relocation: Symbol - Ip + Addend > >> > // > >> > VerboseMsg ("R_X86_64_PC32"); > >> > - VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", > >> > - (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), > >> > + VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", > >> > + (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), > >> > *(UINT32 *)Targ); > >> > *(UINT32 *)Targ = (UINT32) (*(UINT32 *)Targ > >> > + (mCoffSectionsOffset[Sym->st_shndx] - SymShdr->sh_addr) > >> > - (SecOffset - SecShdr->sh_addr)); > >> > VerboseMsg ("Relocation: 0x%08X", *(UINT32 *)Targ); > >> > break; > >> > + case R_X86_64_PLT32: > >> > + // > >> > + // Relative relocation: L + A - P > >> > + // > >> > + VerboseMsg ("R_X86_64_PLT32"); > >> > + VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", > >> > + (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), > >> > + *(UINT32 *)Targ); > >> > + *(UINT32 *)Targ = (UINT32) (*(UINT32 *)Targ > >> > + + (mCoffSectionsOffset[Sym->st_shndx] - SymShdr->sh_addr) > >> > + - (SecOffset - SecShdr->sh_addr)); > >> > + VerboseMsg ("Relocation: 0x%08X", *(UINT32 *)Targ); > >> > + break; > >> > + case R_X86_64_GOTPCREL: > >> > + case R_X86_64_REX_GOTPCRELX: > >> > + // > >> > + // Relative relocation: G + GOT + A - P > >> > + // > >> > + VerboseMsg ("R_X86_64_GOTPCREL"); > >> > + break; > >> > default: > >> > Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF > >> > EM_X86_64 > >> relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); > >> > } > >> > @@ -887,6 +907,12 @@ WriteRelocations64 ( > >> > UINT32 Index; > >> > EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; > >> > EFI_IMAGE_DATA_DIRECTORY *Dir; > >> > + UINT64 GoTPcRelPtrOffset = 0; > >> > + UINT64 *RipDisplacementPtr; > >> > + UINT64 *ElfFileGoTPcRelPtr; > >> > + UINT64 *CoffFileGoTPcRelPtr; > >> > + Elf_Shdr *shdr; > >> > + UINT32 i; > >> > > >> > for (Index = 0; Index < mEhdr->e_shnum; Index++) { > >> > Elf_Shdr *RelShdr = GetShdrByIndex(Index); > >> > @@ -902,6 +928,52 @@ WriteRelocations64 ( > >> > switch (ELF_R_TYPE(Rel->r_info)) { > >> > case R_X86_64_NONE: > >> > case R_X86_64_PC32: > >> > + case R_X86_64_PLT32: > >> > + break; > >> > + case R_X86_64_GOTPCREL: > >> > + case R_X86_64_REX_GOTPCRELX: > >> > + // > >> > + // link script force .got and .got.* in .text section, so > >> > GoTPcRel > >> pointer must be in .text section > >> > + // but its value might point to .text or .data section > >> > + // > >> > + RipDisplacementPtr = (UINT64 *)((UINT8*)mEhdr + SecShdr- > >> >sh_offset + Rel->r_offset - SecShdr->sh_addr); > >> > + GoTPcRelPtrOffset = Rel->r_offset + 4 + > >> (INT32)(*RipDisplacementPtr) - SecShdr->sh_addr; > >> > + ElfFileGoTPcRelPtr = (UINT64 *)((UINT8*)mEhdr + SecShdr- > >> >sh_offset + GoTPcRelPtrOffset); > >> > + CoffFileGoTPcRelPtr = (UINT64 *)(mCoffFile + > >> mCoffSectionsOffset[RelShdr->sh_info] + GoTPcRelPtrOffset); > >> > + // > >> > + // Check which section the GoTPcRel pointer point to, and > >> calculate Elf to Coff sections displacement accordingly > >> > + // > >> > + shdr = NULL; > >> > + for (i = 0; i < mEhdr->e_shnum; i++) { > >> > + shdr = GetShdrByIndex(i); > >> > + if ((*ElfFileGoTPcRelPtr >= shdr->sh_addr) && > >> > + (*ElfFileGoTPcRelPtr < shdr->sh_addr + > >> > shdr->sh_size)) { > >> > + break; > >> > + } > >> > + } > >> > + // > >> > + // Fix the Elf to Coff sections displacement > >> > + // > >> > + if(IsDataShdr(shdr)) { > >> > + *CoffFileGoTPcRelPtr = *CoffFileGoTPcRelPtr + > >> > mDataOffset - > >> shdr->sh_addr; > >> > + }else if (IsTextShdr(SecShdr)){ > >> > + *CoffFileGoTPcRelPtr = *CoffFileGoTPcRelPtr + > >> > mTextOffset - > >> shdr->sh_addr; > >> > + }else { > >> > + // > >> > + // link script force to merge .rodata .rodata.*, .got > >> > and .got.* > >> in .text section, > >> > + // not support GoTPcRel point to section other than > >> > .data > or .text > >> > + // > >> > + Error (NULL, 0, 3000, "Invalid", "Not support relocate > >> R_X86_64_GOTPCREL address in section other than .data or .text"); > >> > + assert (FALSE); > >> > + } > >> > + > >> > + VerboseMsg ("R_X86_64_GOTPCREL to > >> EFI_IMAGE_REL_BASED_DIR64 Offset: 0x%08X", > >> > + mCoffSectionsOffset[RelShdr->sh_info] + > >> > GoTPcRelPtrOffset); > >> > + CoffAddFixup( > >> > + (UINT32)(UINTN)((UINT64) mCoffSectionsOffset[RelShdr- > >> >sh_info] + GoTPcRelPtrOffset), > >> > + EFI_IMAGE_REL_BASED_DIR64); > >> > + VerboseMsg ("Relocation: 0x%08X", > >> *(UINT64*)CoffFileGoTPcRelPtr); > >> > + > >> > break; > >> > case R_X86_64_64: > >> > VerboseMsg ("EFI_IMAGE_REL_BASED_DIR64 Offset: 0x%08X", > >> > diff --git a/BaseTools/Source/C/GenFw/elf_common.h > >> b/BaseTools/Source/C/GenFw/elf_common.h > >> > old mode 100644 > >> > new mode 100755 > >> > index 766d0e4..caaae23 > >> > --- a/BaseTools/Source/C/GenFw/elf_common.h > >> > +++ b/BaseTools/Source/C/GenFw/elf_common.h > >> > @@ -1052,6 +1052,6 @@ typedef struct { > >> > #define R_X86_64_DTPOFF32 21 /* Offset in TLS block */ > >> > #define R_X86_64_GOTTPOFF 22 /* PC relative offset to > >> > IE > GOT > >> entry */ > >> > #define R_X86_64_TPOFF32 23 /* Offset in static TLS > >> > block > */ > >> > - > >> > +#define R_X86_64_REX_GOTPCRELX 0x2a > >> > > >> > #endif /* !_SYS_ELF_COMMON_H_ */ > >> > -- > >> > 2.7.4 > >> > > >> > _______________________________________________ > >> > edk2-devel mailing list > >> > edk2-devel@lists.01.org > >> > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel