On darwin in final linked images, the __TEXT segment covers that start of the file. That means in memory a process can see the mach_header (and load commands) for every loaded image in a process. There are APIs that take and return the mach_header addresses as a way to specify a particular loaded image. For completeness, any code can get the address of the mach_header of the image it is in by using &__dso_handle. In addition there are mach-o type specific symbols like __mh_execute_header. The linker needs to supply a definition for any of these symbols if used. But the address the symbol it resolves to is not in any section. Instead it is the address of the start of the __TEXT segment. I needed to make a small change to SimpleFileNode to not override resetNextIndex() because the Driver creates a SimpleFileNode to hold the internal/implicit files that the context/writer can create. For some reason SimpleFileNode overrode resetNextIndex() to do nothing instead of reseting the index (which mach-o needs if the internal file is an archive). llvm-svn: 221822
88 lines
2.0 KiB
C++
88 lines
2.0 KiB
C++
//===- DefinedAtom.cpp ------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Linker
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "lld/Core/DefinedAtom.h"
|
|
|
|
|
|
namespace lld {
|
|
|
|
|
|
DefinedAtom::ContentPermissions DefinedAtom::permissions() const {
|
|
// By default base permissions on content type.
|
|
return permissions(this->contentType());
|
|
}
|
|
|
|
// Utility function for deriving permissions from content type
|
|
DefinedAtom::ContentPermissions DefinedAtom::permissions(ContentType type) {
|
|
switch (type) {
|
|
case typeCode:
|
|
case typeResolver:
|
|
case typeBranchIsland:
|
|
case typeBranchShim:
|
|
case typeStub:
|
|
case typeStubHelper:
|
|
case typeMachHeader:
|
|
return permR_X;
|
|
|
|
case typeConstant:
|
|
case typeCString:
|
|
case typeUTF16String:
|
|
case typeCFI:
|
|
case typeLSDA:
|
|
case typeLiteral4:
|
|
case typeLiteral8:
|
|
case typeLiteral16:
|
|
case typeDTraceDOF:
|
|
case typeCompactUnwindInfo:
|
|
case typeProcessedUnwindInfo:
|
|
case typeRONote:
|
|
case typeNoAlloc:
|
|
return permR__;
|
|
|
|
case typeData:
|
|
case typeDataFast:
|
|
case typeZeroFill:
|
|
case typeZeroFillFast:
|
|
case typeObjC1Class:
|
|
case typeLazyPointer:
|
|
case typeLazyDylibPointer:
|
|
case typeThunkTLV:
|
|
case typeRWNote:
|
|
return permRW_;
|
|
|
|
case typeGOT:
|
|
case typeConstData:
|
|
case typeCFString:
|
|
case typeInitializerPtr:
|
|
case typeTerminatorPtr:
|
|
case typeCStringPtr:
|
|
case typeObjCClassPtr:
|
|
case typeObjC2CategoryList:
|
|
case typeInterposingTuples:
|
|
case typeTLVInitialData:
|
|
case typeTLVInitialZeroFill:
|
|
case typeTLVInitializerPtr:
|
|
case typeThreadData:
|
|
case typeThreadZeroFill:
|
|
return permRW_L;
|
|
|
|
case typeGroupComdat:
|
|
case typeGnuLinkOnce:
|
|
case typeUnknown:
|
|
case typeTempLTO:
|
|
return permUnknown;
|
|
}
|
|
llvm_unreachable("unknown content type");
|
|
}
|
|
|
|
|
|
} // namespace
|
|
|