[lld] r208670 - [ELF] Emit DT_TEXTREL dynamic table flag.

Shankar Easwaran shankare at codeaurora.org
Tue May 13 06:15:23 PDT 2014


Hi Simon,

I thought you were planning to make this a Pass instead ?

Thanks

Shankar Easwaran

On 5/13/2014 2:37 AM, Simon Atanasyan wrote:
> Author: atanasyan
> Date: Tue May 13 02:37:09 2014
> New Revision: 208670
>
> URL: http://llvm.org/viewvc/llvm-project?rev=208670&view=rev
> Log:
> [ELF] Emit DT_TEXTREL dynamic table flag.
>
> If one or more dynamic relocation might modify a read-only section,
> dynamic table should contain DT_TEXTREL tag.
>
> The patch introduces new `RelocationTable::canModifyReadonlySection()`
> method. This method checks through the relocations to see if any modifies
> a read-only section. The DynamicTable class calls this method and emits
> the DT_TEXTREL tag if necessary.
>
> The patch reviewed by Rui Ueyama and Shankar Easwaran.
>
> Added:
>      lld/trunk/test/elf/Mips/dt-textrel.test
> Modified:
>      lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h
>
> Modified: lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h?rev=208670&r1=208669&r2=208670&view=diff
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h (original)
> +++ lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h Tue May 13 02:37:09 2014
> @@ -954,6 +954,16 @@ public:
>       _symbolTable = symbolTable;
>     }
>   
> +  /// \brief Check if any relocation modifies a read-only section.
> +  bool canModifyReadonlySection() const {
> +    for (const auto &rel : _relocs) {
> +      const DefinedAtom *atom = rel.first;
> +      if ((atom->permissions() & DefinedAtom::permRW_) != DefinedAtom::permRW_)
> +        return true;
> +    }
> +    return false;
> +  }
> +
>     virtual void finalize() {
>       this->_link = _symbolTable ? _symbolTable->ordinal() : 0;
>       if (this->_parent)
> @@ -1080,6 +1090,11 @@ public:
>         _dt_relasz = addEntry(dyn);
>         dyn.d_tag = isRela ? DT_RELAENT : DT_RELENT;
>         _dt_relaent = addEntry(dyn);
> +
> +      if (_layout.getDynamicRelocationTable()->canModifyReadonlySection()) {
> +        dyn.d_tag = DT_TEXTREL;
> +        _dt_textrel = addEntry(dyn);
> +      }
>       }
>       if (_layout.hasPLTRelocationTable()) {
>         dyn.d_tag = DT_PLTRELSZ;
> @@ -1165,6 +1180,7 @@ private:
>     std::size_t _dt_jmprel;
>     std::size_t _dt_fini_array;
>     std::size_t _dt_fini_arraysz;
> +  std::size_t _dt_textrel;
>     TargetLayout<ELFT> &_layout;
>     DynamicSymbolTable<ELFT> *_dynamicSymbolTable;
>     HashSection<ELFT> *_hashTable;
>
> Added: lld/trunk/test/elf/Mips/dt-textrel.test
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/dt-textrel.test?rev=208670&view=auto
> ==============================================================================
> --- lld/trunk/test/elf/Mips/dt-textrel.test (added)
> +++ lld/trunk/test/elf/Mips/dt-textrel.test Tue May 13 02:37:09 2014
> @@ -0,0 +1,47 @@
> +# Check that if a dynamic relocation modify a read-only section,
> +# .dynamic section contains the DT_TEXTREL tag.
> +
> +# RUN: yaml2obj -format=elf %S/Inputs/pic-obj.yaml > %t-so-obj
> +# RUN: lld -flavor gnu -target mipsel -shared -o %t-so %t-so-obj
> +# RUN: yaml2obj -format=elf %s > %t-obj
> +# RUN: lld -flavor gnu -target mipsel -e T0 -o %t-exe %t-obj %t-so
> +# RUN: llvm-readobj -dynamic-table %t-exe | FileCheck %s
> +
> +# CHECK: 0x{{[0-9A-F]+}} TEXTREL
> +
> +FileHeader:
> +  Class:           ELFCLASS32
> +  Data:            ELFDATA2LSB
> +  Type:            ET_REL
> +  Machine:         EM_MIPS
> +  Flags:           [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
> +                     EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
> +Sections:
> +  - Name:            .text
> +    Type:            SHT_PROGBITS
> +    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
> +    AddressAlign:    0x04
> +    Content:         '00000000'
> +
> +  - Name:            .rel.text
> +    Type:            SHT_REL
> +    Link:            .symtab
> +    Info:            .text
> +    AddressAlign:    0x04
> +    Relocations:
> +      - Offset:      0
> +        Symbol:      T1
> +        Type:        R_MIPS_32
> +
> +Symbols:
> +  Local:
> +    - Name:            .text
> +      Type:            STT_SECTION
> +      Section:         .text
> +
> +  Global:
> +    - Name:            T0
> +      Type:            STT_FUNC
> +      Section:         .text
> +      Size:            0x04
> +    - Name:            T1
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation




More information about the llvm-commits mailing list