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