[lld] r221831 - [mach-o] Sort GOT entries by name to make links reproducible

Shankar Easwaran shankare at codeaurora.org
Wed Nov 12 15:36:55 PST 2014


Nice!

On 11/12/2014 5:34 PM, Nick Kledzik wrote:
> Author: kledzik
> Date: Wed Nov 12 17:34:23 2014
> New Revision: 221831
>
> URL: http://llvm.org/viewvc/llvm-project?rev=221831&view=rev
> Log:
> [mach-o] Sort GOT entries by name to make links reproducible
>
> The GOT slots were being laid out in a random order by the GOTPass which
> caused randomness in the output file.
>
> Note: With this change lld now bootstraps on darwin.  That is:
> 1) link lld using system linker to make lld.1
> 2) link lld using lld.1 to make lld.2
> 3) link lld using lld.2 to make lld.3
> Now lld.2 and lld.3 are identical.
>
> Added:
>      lld/trunk/test/mach-o/got-order.yaml
> Modified:
>      lld/trunk/lib/ReaderWriter/MachO/GOTPass.cpp
>
> Modified: lld/trunk/lib/ReaderWriter/MachO/GOTPass.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/GOTPass.cpp?rev=221831&r1=221830&r2=221831&view=diff
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/MachO/GOTPass.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/MachO/GOTPass.cpp Wed Nov 12 17:34:23 2014
> @@ -52,8 +52,8 @@ namespace mach_o {
>   //
>   class GOTEntryAtom : public SimpleDefinedAtom {
>   public:
> -  GOTEntryAtom(const File &file, bool is64)
> -    : SimpleDefinedAtom(file), _is64(is64) { }
> +  GOTEntryAtom(const File &file, bool is64, StringRef name)
> +    : SimpleDefinedAtom(file), _is64(is64), _name(name) { }
>   
>     ContentType contentType() const override {
>       return DefinedAtom::typeGOT;
> @@ -77,8 +77,13 @@ public:
>       return llvm::makeArrayRef(zeros, size());
>     }
>   
> +  StringRef slotName() const {
> +    return _name;
> +  }
> +
>   private:
>     const bool _is64;
> +  StringRef _name;
>   };
>   
>   
> @@ -116,9 +121,17 @@ private:
>         }
>       }
>   
> -    // add all created GOT Atoms to master file
> +    // Sort and add all created GOT Atoms to master file
> +    std::vector<const GOTEntryAtom *> entries;
> +    entries.reserve(_targetToGOT.size());
>       for (auto &it : _targetToGOT)
> -      mergedFile->addAtom(*it.second);
> +      entries.push_back(it.second);
> +    std::sort(entries.begin(), entries.end(),
> +              [](const GOTEntryAtom *left, const GOTEntryAtom *right) {
> +      return (left->slotName().compare(right->slotName()) < 0);
> +    });
> +    for (const GOTEntryAtom *slot : entries)
> +      mergedFile->addAtom(*slot);
>     }
>   
>     bool shouldReplaceTargetWithGOTAtom(const Atom *target, bool canBypassGOT) {
> @@ -142,7 +155,7 @@ private:
>       auto pos = _targetToGOT.find(target);
>       if (pos == _targetToGOT.end()) {
>         GOTEntryAtom *gotEntry = new (_file.allocator())
> -                                        GOTEntryAtom(_file, _context.is64Bit());
> +          GOTEntryAtom(_file, _context.is64Bit(), target->name());
>         _targetToGOT[target] = gotEntry;
>         const ArchHandler::ReferenceInfo &nlInfo = _archHandler.stubInfo().
>                                                   nonLazyPointerReferenceToBinder;
>
> Added: lld/trunk/test/mach-o/got-order.yaml
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/got-order.yaml?rev=221831&view=auto
> ==============================================================================
> --- lld/trunk/test/mach-o/got-order.yaml (added)
> +++ lld/trunk/test/mach-o/got-order.yaml Wed Nov 12 17:34:23 2014
> @@ -0,0 +1,134 @@
> +# RUN: lld -flavor darwin -arch x86_64  %s -o %t %p/Inputs/libSystem.yaml
> +# RUN: llvm-objdump -bind %t | FileCheck %s
> +#
> +# Test that GOT slots are sorted by name
> +#
> +
> +--- !mach-o
> +arch:            x86_64
> +file-type:       MH_OBJECT
> +flags:           [ MH_SUBSECTIONS_VIA_SYMBOLS ]
> +sections:
> +  - segment:         __TEXT
> +    section:         __text
> +    type:            S_REGULAR
> +    attributes:      [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
> +    address:         0x0000000000000000
> +    content:         [ 0x55, 0x48, 0x89, 0xE5, 0x48, 0x8B, 0x0D, 0x00,
> +                       0x00, 0x00, 0x00, 0x48, 0x8B, 0x05, 0x00, 0x00,
> +                       0x00, 0x00, 0x8B, 0x00, 0x03, 0x01, 0x48, 0x8B,
> +                       0x0D, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x5D,
> +                       0xC3 ]
> +    relocations:
> +      - offset:          0x00000019
> +        type:            X86_64_RELOC_GOT_LOAD
> +        length:          2
> +        pc-rel:          true
> +        extern:          true
> +        symbol:          2
> +      - offset:          0x0000000E
> +        type:            X86_64_RELOC_GOT_LOAD
> +        length:          2
> +        pc-rel:          true
> +        extern:          true
> +        symbol:          1
> +      - offset:          0x00000007
> +        type:            X86_64_RELOC_GOT_LOAD
> +        length:          2
> +        pc-rel:          true
> +        extern:          true
> +        symbol:          3
> +global-symbols:
> +  - name:            _func
> +    type:            N_SECT
> +    scope:           [ N_EXT ]
> +    sect:            1
> +    value:           0x0000000000000000
> +undefined-symbols:
> +  - name:            _aaa
> +    type:            N_UNDF
> +    scope:           [ N_EXT ]
> +    value:           0x0000000000000000
> +  - name:            _fff
> +    type:            N_UNDF
> +    scope:           [ N_EXT ]
> +    value:           0x0000000000000000
> +  - name:            _zzz
> +    type:            N_UNDF
> +    scope:           [ N_EXT ]
> +    value:           0x0000000000000000
> +
> +--- !mach-o
> +arch:            x86_64
> +file-type:       MH_OBJECT
> +flags:           [ MH_SUBSECTIONS_VIA_SYMBOLS ]
> +sections:
> +  - segment:         __TEXT
> +    section:         __text
> +    type:            S_REGULAR
> +    attributes:      [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
> +    address:         0x0000000000000000
> +    content:         [ 0x55, 0x48, 0x89, 0xE5, 0x48, 0x8B, 0x0D, 0x00,
> +                       0x00, 0x00, 0x00, 0x48, 0x8B, 0x05, 0x00, 0x00,
> +                       0x00, 0x00, 0x8B, 0x00, 0x03, 0x01, 0x48, 0x8B,
> +                       0x0D, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x5D,
> +                       0xC3 ]
> +    relocations:
> +      - offset:          0x00000019
> +        type:            X86_64_RELOC_GOT_LOAD
> +        length:          2
> +        pc-rel:          true
> +        extern:          true
> +        symbol:          2
> +      - offset:          0x0000000E
> +        type:            X86_64_RELOC_GOT_LOAD
> +        length:          2
> +        pc-rel:          true
> +        extern:          true
> +        symbol:          1
> +      - offset:          0x00000007
> +        type:            X86_64_RELOC_GOT_LOAD
> +        length:          2
> +        pc-rel:          true
> +        extern:          true
> +        symbol:          3
> +global-symbols:
> +  - name:            _main
> +    type:            N_SECT
> +    scope:           [ N_EXT ]
> +    sect:            1
> +    value:           0x0000000000000000
> +undefined-symbols:
> +  - name:            _bar
> +    type:            N_UNDF
> +    scope:           [ N_EXT ]
> +    value:           0x0000000000000000
> +  - name:            _foo
> +    type:            N_UNDF
> +    scope:           [ N_EXT ]
> +    value:           0x0000000000000000
> +  - name:            _zazzle
> +    type:            N_UNDF
> +    scope:           [ N_EXT ]
> +    value:           0x0000000000000000
> +
> +--- !mach-o
> +arch:            x86_64
> +file-type:       MH_DYLIB
> +install-name:    /usr/lib/libfoobar.dylib
> +exports:
> +  - name:            _bar
> +  - name:            _zazzle
> +  - name:            _foo
> +  - name:            _aaa
> +  - name:            _fff
> +  - name:            _zzz
> +...
> +
> +
> +# CHECK:	    __DATA   __got  {{[0-9a-zA-Z _]+}} pointer   0 libfoobar     _aaa
> +# CHECK-NEXT:	__DATA   __got  {{[0-9a-zA-Z _]+}} pointer   0 libfoobar     _bar
> +# CHECK-NEXT:	__DATA   __got  {{[0-9a-zA-Z _]+}} pointer   0 libfoobar     _fff
> +# CHECK-NEXT:	__DATA   __got  {{[0-9a-zA-Z _]+}} pointer   0 libfoobar     _foo
> +# CHECK-NEXT:	__DATA   __got  {{[0-9a-zA-Z _]+}} pointer   0 libfoobar     _zazzle
> +# CHECK-NEXT:	__DATA   __got  {{[0-9a-zA-Z _]+}} pointer   0 libfoobar     _zzz
>
>
> _______________________________________________
> 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