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

Reply via email to