Ok, will separate it. Thank you to 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 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