blob: ba2df6c0e489308fb6153160063226ddc977be62 [file] [log] [blame]
Nick Kledzikabb69812012-05-31 22:34:00 +00001//===- lib/ReaderWriter/MachO/ExecutableAtoms.hpp -------------------------===//
2//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Rui Ueyama014192db2013-11-15 03:09:26 +000010#ifndef LLD_READER_WRITER_MACHO_EXECUTABLE_ATOMS_H
11#define LLD_READER_WRITER_MACHO_EXECUTABLE_ATOMS_H
Nick Kledzikabb69812012-05-31 22:34:00 +000012
Nick Kledzik16cfa602014-11-12 22:21:56 +000013#include "Atoms.h"
14
Nick Kledzik473933b2013-09-27 22:50:00 +000015#include "llvm/Support/MachO.h"
Nick Kledzikabb69812012-05-31 22:34:00 +000016
Nick Kledzik16cfa602014-11-12 22:21:56 +000017#include "lld/Core/ArchiveLibraryFile.h"
Nick Kledzikabb69812012-05-31 22:34:00 +000018#include "lld/Core/DefinedAtom.h"
Nick Kledzikabb69812012-05-31 22:34:00 +000019#include "lld/Core/File.h"
Rui Ueyama0ca149f2013-08-06 22:31:59 +000020#include "lld/Core/LinkingContext.h"
Rui Ueyamae05d3802014-06-11 21:47:51 +000021#include "lld/Core/Reference.h"
22#include "lld/Core/Simple.h"
23#include "lld/Core/UndefinedAtom.h"
Rafael Espindola1675d512014-06-12 17:12:28 +000024#include "lld/ReaderWriter/MachOLinkingContext.h"
Nick Kledzikabb69812012-05-31 22:34:00 +000025
26namespace lld {
27namespace mach_o {
28
29
30//
Nick Kledzikebf093602014-08-13 23:31:07 +000031// CEntryFile adds an UndefinedAtom for "_main" so that the Resolving
Nick Kledzikabb69812012-05-31 22:34:00 +000032// phase will fail if "_main" is undefined.
33//
Nick Kledzikebf093602014-08-13 23:31:07 +000034class CEntryFile : public SimpleFile {
Nick Kledzikabb69812012-05-31 22:34:00 +000035public:
Nick Kledzikebf093602014-08-13 23:31:07 +000036 CEntryFile(const MachOLinkingContext &context)
37 : SimpleFile("C entry"),
38 _undefMain(*this, context.entrySymbolName()) {
39 this->addAtom(_undefMain);
40 }
Nick Kledzikc314b462013-04-04 18:59:24 +000041
Nick Kledzikabb69812012-05-31 22:34:00 +000042private:
43 SimpleUndefinedAtom _undefMain;
Nick Kledzikebf093602014-08-13 23:31:07 +000044};
45
46
47//
48// StubHelperFile adds an UndefinedAtom for "dyld_stub_binder" so that
49// the Resolveing phase will fail if "dyld_stub_binder" is undefined.
50//
51class StubHelperFile : public SimpleFile {
52public:
53 StubHelperFile(const MachOLinkingContext &context)
54 : SimpleFile("stub runtime"),
55 _undefBinder(*this, context.binderSymbolName()) {
56 this->addAtom(_undefBinder);
57 }
58
59private:
Nick Kledzik2458bec2014-07-16 19:49:02 +000060 SimpleUndefinedAtom _undefBinder;
Nick Kledzikabb69812012-05-31 22:34:00 +000061};
62
Nick Kledzikebf093602014-08-13 23:31:07 +000063
Nick Kledzik16cfa602014-11-12 22:21:56 +000064//
65// MachHeaderAliasFile lazily instantiates the magic symbols that mark the start
66// of the mach_header for final linked images.
67//
68class MachHeaderAliasFile : public ArchiveLibraryFile {
69public:
70 MachHeaderAliasFile(const MachOLinkingContext &context)
71 : ArchiveLibraryFile("mach_header symbols") {
72 switch (context.outputMachOType()) {
73 case llvm::MachO::MH_EXECUTE:
74 _machHeaderSymbolName = "__mh_execute_header";
75 break;
76 case llvm::MachO::MH_DYLIB:
77 _machHeaderSymbolName = "__mh_dylib_header";
78 break;
79 case llvm::MachO::MH_BUNDLE:
80 _machHeaderSymbolName = "__mh_bundle_header";
81 break;
82 case llvm::MachO::MH_DYLINKER:
83 _machHeaderSymbolName = "__mh_dylinker_header";
84 break;
85 case llvm::MachO::MH_PRELOAD:
86 _machHeaderSymbolName = "__mh_preload_header";
87 break;
88 default:
89 llvm_unreachable("no mach_header symbol for file type");
90 }
91 }
92
93 std::error_code
Rui Ueyamacfb25342015-01-14 00:21:34 +000094 parseAllMembers(std::vector<std::unique_ptr<File>> &result) const override {
Nick Kledzik16cfa602014-11-12 22:21:56 +000095 return std::error_code();
96 }
97
98 const File *find(StringRef sym, bool dataSymbolOnly) const override {
99 if (sym.equals("___dso_handle") || sym.equals(_machHeaderSymbolName)) {
100 _definedAtoms._atoms.push_back(new (_alloc) MachODefinedAtom(
101 *this, sym, DefinedAtom::scopeLinkageUnit,
102 DefinedAtom::typeMachHeader, DefinedAtom::mergeNo, false, false,
Nick Kledzik63adb082014-11-18 00:30:25 +0000103 ArrayRef<uint8_t>(), DefinedAtom::Alignment(12,0)));
Nick Kledzik16cfa602014-11-12 22:21:56 +0000104 return this;
105 }
106 return nullptr;
107 }
108
109 const atom_collection<DefinedAtom> &defined() const override {
110 return _definedAtoms;
111 }
112 const atom_collection<UndefinedAtom> &undefined() const override {
113 return _undefinedAtoms;
114 }
115
116 const atom_collection<SharedLibraryAtom> &sharedLibrary() const override {
117 return _sharedLibraryAtoms;
118 }
119
120 const atom_collection<AbsoluteAtom> &absolute() const override {
121 return _absoluteAtoms;
122 }
Nick Kledzikebf093602014-08-13 23:31:07 +0000123
124
Nick Kledzik16cfa602014-11-12 22:21:56 +0000125private:
126 mutable atom_collection_vector<DefinedAtom> _definedAtoms;
127 atom_collection_vector<UndefinedAtom> _undefinedAtoms;
128 atom_collection_vector<SharedLibraryAtom> _sharedLibraryAtoms;
129 atom_collection_vector<AbsoluteAtom> _absoluteAtoms;
130 StringRef _machHeaderSymbolName;
131 mutable llvm::BumpPtrAllocator _alloc;
132};
Nick Kledzikebf093602014-08-13 23:31:07 +0000133
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000134} // namespace mach_o
135} // namespace lld
Nick Kledzikabb69812012-05-31 22:34:00 +0000136
Rui Ueyama014192db2013-11-15 03:09:26 +0000137#endif // LLD_READER_WRITER_MACHO_EXECUTABLE_ATOMS_H