summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp42
-rw-r--r--lld/lib/ReaderWriter/MachO/WriterMachO.cpp11
-rw-r--r--lld/test/mach-o/Inputs/libSystem.yaml13
-rw-r--r--lld/test/mach-o/arm-interworking-movw.yaml4
-rw-r--r--lld/test/mach-o/arm-interworking.yaml3
-rw-r--r--lld/test/mach-o/dylib-install-names.yaml9
-rw-r--r--lld/test/mach-o/sectalign.yaml3
7 files changed, 59 insertions, 26 deletions
diff --git a/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp b/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
index e12b881047c..f0788fa3da1 100644
--- a/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
+++ b/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
@@ -25,30 +25,42 @@ namespace mach_o {
//
-// CRuntimeFile adds an UndefinedAtom for "_main" so that the Resolving
+// CEntryFile adds an UndefinedAtom for "_main" so that the Resolving
// phase will fail if "_main" is undefined.
//
-class CRuntimeFile : public SimpleFile {
+class CEntryFile : public SimpleFile {
public:
- CRuntimeFile(const MachOLinkingContext &context)
- : SimpleFile("C runtime"),
- _undefMain(*this, context.entrySymbolName()),
- _undefBinder(*this, context.binderSymbolName()) {
- // only main executables need _main
- if (context.outputMachOType() == llvm::MachO::MH_EXECUTE) {
- this->addAtom(_undefMain);
- }
- // only dynamic binaries use stubs
- if (context.needsStubsPass()) {
- this->addAtom(_undefBinder);
- }
- }
+ CEntryFile(const MachOLinkingContext &context)
+ : SimpleFile("C entry"),
+ _undefMain(*this, context.entrySymbolName()) {
+ this->addAtom(_undefMain);
+ }
private:
SimpleUndefinedAtom _undefMain;
+};
+
+
+//
+// StubHelperFile adds an UndefinedAtom for "dyld_stub_binder" so that
+// the Resolveing phase will fail if "dyld_stub_binder" is undefined.
+//
+class StubHelperFile : public SimpleFile {
+public:
+ StubHelperFile(const MachOLinkingContext &context)
+ : SimpleFile("stub runtime"),
+ _undefBinder(*this, context.binderSymbolName()) {
+ this->addAtom(_undefBinder);
+ }
+
+private:
SimpleUndefinedAtom _undefBinder;
};
+
+
+
+
} // namespace mach_o
} // namespace lld
diff --git a/lld/lib/ReaderWriter/MachO/WriterMachO.cpp b/lld/lib/ReaderWriter/MachO/WriterMachO.cpp
index f76bfffbca9..17102df6349 100644
--- a/lld/lib/ReaderWriter/MachO/WriterMachO.cpp
+++ b/lld/lib/ReaderWriter/MachO/WriterMachO.cpp
@@ -46,10 +46,13 @@ public:
}
bool createImplicitFiles(std::vector<std::unique_ptr<File> > &r) override {
- if (_context.outputMachOType() == llvm::MachO::MH_EXECUTE) {
- // When building main executables, add _main as required entry point.
- r.emplace_back(new CRuntimeFile(_context));
- }
+ // When building main executables, add _main as required entry point.
+ if (_context.outputTypeHasEntry())
+ r.emplace_back(new CEntryFile(_context));
+ // If this can link with dylibs, need helper function (dyld_stub_binder).
+ if (_context.needsStubsPass())
+ r.emplace_back(new StubHelperFile(_context));
+
return true;
}
private:
diff --git a/lld/test/mach-o/Inputs/libSystem.yaml b/lld/test/mach-o/Inputs/libSystem.yaml
new file mode 100644
index 00000000000..2a7f46381dc
--- /dev/null
+++ b/lld/test/mach-o/Inputs/libSystem.yaml
@@ -0,0 +1,13 @@
+#
+# For use by test cases that create dynamic output types which may needs stubs
+# and therefore will need a dylib definition of dyld_stub_binder.
+#
+
+---
+shared-library-atoms:
+ - name: dyld_stub_binder
+ load-name: /usr/lib/libSystem.B.dylib
+ type: code
+ size: 0
+
+...
diff --git a/lld/test/mach-o/arm-interworking-movw.yaml b/lld/test/mach-o/arm-interworking-movw.yaml
index d291513df0f..1d61b6257f3 100644
--- a/lld/test/mach-o/arm-interworking-movw.yaml
+++ b/lld/test/mach-o/arm-interworking-movw.yaml
@@ -1,7 +1,7 @@
# REQUIRES: arm
# RUN: lld -flavor darwin -arch armv7 -r -print_atoms %s -o %t | FileCheck %s \
-# RUN: && lld -flavor darwin -arch armv7 -dylib -print_atoms \
-# RUN: -sectalign __TEXT __text 0x1000 %t -o %t2 | FileCheck %s \
+# RUN: && lld -flavor darwin -arch armv7 -dylib -print_atoms %t -o %t2 \
+# RUN: %p/Inputs/libSystem.yaml -sectalign __TEXT __text 0x1000 | FileCheck %s \
# RUN: && llvm-objdump -d -macho -triple=armv7-apple-ios %t2 | FileCheck -check-prefix=ACODE %s \
# RUN: && llvm-objdump -d -macho -triple=thumbv7-apple-ios %t2 | FileCheck -check-prefix=TCODE %s
#
diff --git a/lld/test/mach-o/arm-interworking.yaml b/lld/test/mach-o/arm-interworking.yaml
index 59e311f91b2..156c5ff8d2a 100644
--- a/lld/test/mach-o/arm-interworking.yaml
+++ b/lld/test/mach-o/arm-interworking.yaml
@@ -1,5 +1,6 @@
# RUN: lld -flavor darwin -arch armv7 -r -print_atoms %s -o %t | FileCheck %s \
-# RUN: && lld -flavor darwin -arch armv7 -dylib -print_atoms %t -o %t2 | FileCheck %s \
+# RUN: && lld -flavor darwin -arch armv7 -dylib -print_atoms \
+# RUN: %p/Inputs/libSystem.yaml %t -o %t2 | FileCheck %s \
# RUN: && macho-dump --dump-section-data %t2 | FileCheck -check-prefix=CODE %s
#
# Test thumb and arm branches round trip through -r.
diff --git a/lld/test/mach-o/dylib-install-names.yaml b/lld/test/mach-o/dylib-install-names.yaml
index 2ee361e59bc..cdfe59178d2 100644
--- a/lld/test/mach-o/dylib-install-names.yaml
+++ b/lld/test/mach-o/dylib-install-names.yaml
@@ -1,12 +1,15 @@
# Check we accept -install_name correctly:
-# RUN: lld -flavor darwin -arch x86_64 -install_name libwibble.dylib -dylib %s -o %t.dylib
+# RUN: lld -flavor darwin -arch x86_64 -install_name libwibble.dylib -dylib \
+# RUN: %p/Inputs/libSystem.yaml %s -o %t.dylib
# RUN: macho-dump %t.dylib | FileCheck %s --check-prefix=CHECK-BINARY-WRITE
# Check we read LC_ID_DYLIB correctly:
-# RUN: lld -flavor darwin -arch x86_64 %p/Inputs/use-dylib-install-names.yaml %t.dylib -r -print_atoms | FileCheck %s --check-prefix=CHECK-BINARY-READ
+# RUN: lld -flavor darwin -arch x86_64 %p/Inputs/use-dylib-install-names.yaml \
+# RUN: %t.dylib -r -print_atoms | FileCheck %s --check-prefix=CHECK-BINARY-READ
# Check we default the install-name to the output file:
-# RUN: lld -flavor darwin -arch x86_64 -dylib %s -o libwibble.dylib
+# RUN: lld -flavor darwin -arch x86_64 -dylib %s -o libwibble.dylib \
+# RUN: %p/Inputs/libSystem.yaml
# RUN: macho-dump libwibble.dylib | FileCheck %s --check-prefix=CHECK-BINARY-WRITE
# RUN: rm -f libwibble.dylib
diff --git a/lld/test/mach-o/sectalign.yaml b/lld/test/mach-o/sectalign.yaml
index 7e2ad97ef4e..3556a5ecbcf 100644
--- a/lld/test/mach-o/sectalign.yaml
+++ b/lld/test/mach-o/sectalign.yaml
@@ -1,5 +1,6 @@
# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -dylib \
-# RUN: -sectalign __DATA __custom 0x800 -sectalign __TEXT __text 0x400 -o %t \
+# RUN: -sectalign __DATA __custom 0x800 -sectalign __TEXT __text 0x400 \
+# RUN: %p/Inputs/libSystem.yaml -o %t \
# RUN: && llvm-readobj -sections %t | FileCheck %s
#
# Test -sectalign option on __text and a custom section.
OpenPOWER on IntegriCloud