File objects are not really const in the resolver. We set ordinals to them and call beforeLink hooks. Also, File's member functions marked as const are not really const. ArchiveFile never returns the same member file twice, so it remembers files returned before. find() has side effects. In order to deal with the inconsistencies, we sprinkled const_casts and marked member varaibles as mutable. This patch removes const from there to reflect the reality. llvm-svn: 231212
137 lines
3.9 KiB
C++
137 lines
3.9 KiB
C++
//===- lib/ReaderWriter/MachO/ExecutableAtoms.hpp -------------------------===//
|
|
//
|
|
// The LLVM Linker
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLD_READER_WRITER_MACHO_EXECUTABLE_ATOMS_H
|
|
#define LLD_READER_WRITER_MACHO_EXECUTABLE_ATOMS_H
|
|
|
|
#include "Atoms.h"
|
|
|
|
#include "llvm/Support/MachO.h"
|
|
|
|
#include "lld/Core/ArchiveLibraryFile.h"
|
|
#include "lld/Core/DefinedAtom.h"
|
|
#include "lld/Core/File.h"
|
|
#include "lld/Core/LinkingContext.h"
|
|
#include "lld/Core/Reference.h"
|
|
#include "lld/Core/Simple.h"
|
|
#include "lld/Core/UndefinedAtom.h"
|
|
#include "lld/ReaderWriter/MachOLinkingContext.h"
|
|
|
|
namespace lld {
|
|
namespace mach_o {
|
|
|
|
|
|
//
|
|
// CEntryFile adds an UndefinedAtom for "_main" so that the Resolving
|
|
// phase will fail if "_main" is undefined.
|
|
//
|
|
class CEntryFile : public SimpleFile {
|
|
public:
|
|
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;
|
|
};
|
|
|
|
|
|
//
|
|
// MachHeaderAliasFile lazily instantiates the magic symbols that mark the start
|
|
// of the mach_header for final linked images.
|
|
//
|
|
class MachHeaderAliasFile : public ArchiveLibraryFile {
|
|
public:
|
|
MachHeaderAliasFile(const MachOLinkingContext &context)
|
|
: ArchiveLibraryFile("mach_header symbols") {
|
|
switch (context.outputMachOType()) {
|
|
case llvm::MachO::MH_EXECUTE:
|
|
_machHeaderSymbolName = "__mh_execute_header";
|
|
break;
|
|
case llvm::MachO::MH_DYLIB:
|
|
_machHeaderSymbolName = "__mh_dylib_header";
|
|
break;
|
|
case llvm::MachO::MH_BUNDLE:
|
|
_machHeaderSymbolName = "__mh_bundle_header";
|
|
break;
|
|
case llvm::MachO::MH_DYLINKER:
|
|
_machHeaderSymbolName = "__mh_dylinker_header";
|
|
break;
|
|
case llvm::MachO::MH_PRELOAD:
|
|
_machHeaderSymbolName = "__mh_preload_header";
|
|
break;
|
|
default:
|
|
llvm_unreachable("no mach_header symbol for file type");
|
|
}
|
|
}
|
|
|
|
std::error_code
|
|
parseAllMembers(std::vector<std::unique_ptr<File>> &result) override {
|
|
return std::error_code();
|
|
}
|
|
|
|
File *find(StringRef sym, bool dataSymbolOnly) override {
|
|
if (sym.equals("___dso_handle") || sym.equals(_machHeaderSymbolName)) {
|
|
_definedAtoms._atoms.push_back(new (allocator()) MachODefinedAtom(
|
|
*this, sym, DefinedAtom::scopeLinkageUnit,
|
|
DefinedAtom::typeMachHeader, DefinedAtom::mergeNo, false, false,
|
|
ArrayRef<uint8_t>(), DefinedAtom::Alignment(12,0)));
|
|
return this;
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
const atom_collection<DefinedAtom> &defined() const override {
|
|
return _definedAtoms;
|
|
}
|
|
const atom_collection<UndefinedAtom> &undefined() const override {
|
|
return _undefinedAtoms;
|
|
}
|
|
|
|
const atom_collection<SharedLibraryAtom> &sharedLibrary() const override {
|
|
return _sharedLibraryAtoms;
|
|
}
|
|
|
|
const atom_collection<AbsoluteAtom> &absolute() const override {
|
|
return _absoluteAtoms;
|
|
}
|
|
|
|
|
|
private:
|
|
mutable atom_collection_vector<DefinedAtom> _definedAtoms;
|
|
atom_collection_vector<UndefinedAtom> _undefinedAtoms;
|
|
atom_collection_vector<SharedLibraryAtom> _sharedLibraryAtoms;
|
|
atom_collection_vector<AbsoluteAtom> _absoluteAtoms;
|
|
StringRef _machHeaderSymbolName;
|
|
};
|
|
|
|
} // namespace mach_o
|
|
} // namespace lld
|
|
|
|
#endif // LLD_READER_WRITER_MACHO_EXECUTABLE_ATOMS_H
|