blob: e12b881047c716d6fcd9697c5ea2c282b1bdc969 [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 Kledzik473933b2013-09-27 22:50:00 +000013#include "llvm/Support/MachO.h"
Nick Kledzikabb69812012-05-31 22:34:00 +000014
15#include "lld/Core/DefinedAtom.h"
Nick Kledzikabb69812012-05-31 22:34:00 +000016#include "lld/Core/File.h"
Rui Ueyama0ca149f2013-08-06 22:31:59 +000017#include "lld/Core/LinkingContext.h"
Rui Ueyamae05d3802014-06-11 21:47:51 +000018#include "lld/Core/Reference.h"
19#include "lld/Core/Simple.h"
20#include "lld/Core/UndefinedAtom.h"
Rafael Espindola1675d512014-06-12 17:12:28 +000021#include "lld/ReaderWriter/MachOLinkingContext.h"
Nick Kledzikabb69812012-05-31 22:34:00 +000022
23namespace lld {
24namespace mach_o {
25
26
27//
28// CRuntimeFile adds an UndefinedAtom for "_main" so that the Resolving
29// phase will fail if "_main" is undefined.
30//
31class CRuntimeFile : public SimpleFile {
32public:
Rui Ueyama170a1a82013-12-20 07:48:29 +000033 CRuntimeFile(const MachOLinkingContext &context)
Nick Kledzik2458bec2014-07-16 19:49:02 +000034 : SimpleFile("C runtime"),
35 _undefMain(*this, context.entrySymbolName()),
36 _undefBinder(*this, context.binderSymbolName()) {
Nick Kledzikabb69812012-05-31 22:34:00 +000037 // only main executables need _main
Tim Northoverd30a1f22014-06-20 15:59:00 +000038 if (context.outputMachOType() == llvm::MachO::MH_EXECUTE) {
Nick Kledzikabb69812012-05-31 22:34:00 +000039 this->addAtom(_undefMain);
Nick Kledzikc314b462013-04-04 18:59:24 +000040 }
Nick Kledzik2458bec2014-07-16 19:49:02 +000041 // only dynamic binaries use stubs
42 if (context.needsStubsPass()) {
43 this->addAtom(_undefBinder);
44 }
Nick Kledzikabb69812012-05-31 22:34:00 +000045 }
Nick Kledzikc314b462013-04-04 18:59:24 +000046
Nick Kledzikabb69812012-05-31 22:34:00 +000047private:
48 SimpleUndefinedAtom _undefMain;
Nick Kledzik2458bec2014-07-16 19:49:02 +000049 SimpleUndefinedAtom _undefBinder;
Nick Kledzikabb69812012-05-31 22:34:00 +000050};
51
Rui Ueyama0ca149f2013-08-06 22:31:59 +000052} // namespace mach_o
53} // namespace lld
Nick Kledzikabb69812012-05-31 22:34:00 +000054
Rui Ueyama014192db2013-11-15 03:09:26 +000055#endif // LLD_READER_WRITER_MACHO_EXECUTABLE_ATOMS_H