[lld] r221831 - [mach-o] Sort GOT entries by name to make links reproducible
Rafael Avila de Espindola
rafael.espindola at gmail.com
Wed Nov 12 15:39:58 PST 2014
Congratulations!
Sent from my iPhone
> On Nov 12, 2014, at 18:34, Nick Kledzik <kledzik at apple.com> 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
More information about the llvm-commits
mailing list