parent
5c437cd1e9
commit
5e706b3ee3
|
@ -126,14 +126,14 @@ void SectionChunk::writeTo(uint8_t *Buf) {
|
||||||
SymbolBody *Body = File->getSymbolBody(Rel.SymbolTableIndex)->repl();
|
SymbolBody *Body = File->getSymbolBody(Rel.SymbolTableIndex)->repl();
|
||||||
uint64_t S = cast<Defined>(Body)->getRVA();
|
uint64_t S = cast<Defined>(Body)->getRVA();
|
||||||
uint64_t P = RVA + Rel.VirtualAddress;
|
uint64_t P = RVA + Rel.VirtualAddress;
|
||||||
switch (Config->MachineType) {
|
switch (Config->Machine) {
|
||||||
case IMAGE_FILE_MACHINE_AMD64:
|
case AMD64:
|
||||||
applyRelX64(Off, Rel.Type, S, P);
|
applyRelX64(Off, Rel.Type, S, P);
|
||||||
break;
|
break;
|
||||||
case IMAGE_FILE_MACHINE_I386:
|
case I386:
|
||||||
applyRelX86(Off, Rel.Type, S, P);
|
applyRelX86(Off, Rel.Type, S, P);
|
||||||
break;
|
break;
|
||||||
case IMAGE_FILE_MACHINE_ARMNT:
|
case ARMNT:
|
||||||
applyRelARM(Off, Rel.Type, S, P);
|
applyRelARM(Off, Rel.Type, S, P);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -150,16 +150,16 @@ void SectionChunk::addAssociative(SectionChunk *Child) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t getBaserelType(const coff_relocation &Rel) {
|
static uint8_t getBaserelType(const coff_relocation &Rel) {
|
||||||
switch (Config->MachineType) {
|
switch (Config->Machine) {
|
||||||
case IMAGE_FILE_MACHINE_AMD64:
|
case AMD64:
|
||||||
if (Rel.Type == IMAGE_REL_AMD64_ADDR64)
|
if (Rel.Type == IMAGE_REL_AMD64_ADDR64)
|
||||||
return IMAGE_REL_BASED_DIR64;
|
return IMAGE_REL_BASED_DIR64;
|
||||||
return IMAGE_REL_BASED_ABSOLUTE;
|
return IMAGE_REL_BASED_ABSOLUTE;
|
||||||
case IMAGE_FILE_MACHINE_I386:
|
case I386:
|
||||||
if (Rel.Type == IMAGE_REL_I386_DIR32)
|
if (Rel.Type == IMAGE_REL_I386_DIR32)
|
||||||
return IMAGE_REL_BASED_HIGHLOW;
|
return IMAGE_REL_BASED_HIGHLOW;
|
||||||
return IMAGE_REL_BASED_ABSOLUTE;
|
return IMAGE_REL_BASED_ABSOLUTE;
|
||||||
case IMAGE_FILE_MACHINE_ARMNT:
|
case ARMNT:
|
||||||
if (Rel.Type == IMAGE_REL_ARM_ADDR32)
|
if (Rel.Type == IMAGE_REL_ARM_ADDR32)
|
||||||
return IMAGE_REL_BASED_HIGHLOW;
|
return IMAGE_REL_BASED_HIGHLOW;
|
||||||
if (Rel.Type == IMAGE_REL_ARM_MOV32T)
|
if (Rel.Type == IMAGE_REL_ARM_MOV32T)
|
||||||
|
@ -293,8 +293,7 @@ void StringChunk::writeTo(uint8_t *Buf) {
|
||||||
ImportThunkChunkX64::ImportThunkChunkX64(Defined *S) : ImpSymbol(S) {
|
ImportThunkChunkX64::ImportThunkChunkX64(Defined *S) : ImpSymbol(S) {
|
||||||
// Intel Optimization Manual says that all branch targets
|
// Intel Optimization Manual says that all branch targets
|
||||||
// should be 16-byte aligned. MSVC linker does this too.
|
// should be 16-byte aligned. MSVC linker does this too.
|
||||||
if (Config->MachineType == AMD64)
|
Align = 16;
|
||||||
Align = 16;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportThunkChunkX64::writeTo(uint8_t *Buf) {
|
void ImportThunkChunkX64::writeTo(uint8_t *Buf) {
|
||||||
|
@ -368,10 +367,10 @@ void BaserelChunk::writeTo(uint8_t *Buf) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Baserel::getDefaultType() {
|
uint8_t Baserel::getDefaultType() {
|
||||||
switch (Config->MachineType) {
|
switch (Config->Machine) {
|
||||||
case IMAGE_FILE_MACHINE_AMD64:
|
case AMD64:
|
||||||
return IMAGE_REL_BASED_DIR64;
|
return IMAGE_REL_BASED_DIR64;
|
||||||
case IMAGE_FILE_MACHINE_I386:
|
case I386:
|
||||||
return IMAGE_REL_BASED_HIGHLOW;
|
return IMAGE_REL_BASED_HIGHLOW;
|
||||||
default:
|
default:
|
||||||
llvm_unreachable("unknown machine type");
|
llvm_unreachable("unknown machine type");
|
||||||
|
|
|
@ -20,8 +20,6 @@
|
||||||
namespace lld {
|
namespace lld {
|
||||||
namespace coff {
|
namespace coff {
|
||||||
|
|
||||||
using llvm::COFF::IMAGE_FILE_MACHINE_AMD64;
|
|
||||||
using llvm::COFF::IMAGE_FILE_MACHINE_I386;
|
|
||||||
using llvm::COFF::IMAGE_FILE_MACHINE_UNKNOWN;
|
using llvm::COFF::IMAGE_FILE_MACHINE_UNKNOWN;
|
||||||
using llvm::COFF::WindowsSubsystem;
|
using llvm::COFF::WindowsSubsystem;
|
||||||
using llvm::StringRef;
|
using llvm::StringRef;
|
||||||
|
@ -54,9 +52,9 @@ struct Export {
|
||||||
// Global configuration.
|
// Global configuration.
|
||||||
struct Configuration {
|
struct Configuration {
|
||||||
enum ManifestKind { SideBySide, Embed, No };
|
enum ManifestKind { SideBySide, Embed, No };
|
||||||
bool is64() { return MachineType == IMAGE_FILE_MACHINE_AMD64; }
|
bool is64() { return Machine == AMD64; }
|
||||||
|
|
||||||
llvm::COFF::MachineTypes MachineType = IMAGE_FILE_MACHINE_UNKNOWN;
|
llvm::COFF::MachineTypes Machine = IMAGE_FILE_MACHINE_UNKNOWN;
|
||||||
bool Verbose = false;
|
bool Verbose = false;
|
||||||
WindowsSubsystem Subsystem = llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN;
|
WindowsSubsystem Subsystem = llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN;
|
||||||
Undefined *Entry = nullptr;
|
Undefined *Entry = nullptr;
|
||||||
|
|
|
@ -426,7 +426,7 @@ void DelayLoadContents::create(Defined *H) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Chunk *DelayLoadContents::newThunkChunk(DefinedImportData *S, Chunk *Dir) {
|
Chunk *DelayLoadContents::newThunkChunk(DefinedImportData *S, Chunk *Dir) {
|
||||||
switch (Config->MachineType) {
|
switch (Config->Machine) {
|
||||||
case AMD64:
|
case AMD64:
|
||||||
return new ThunkChunkX64(S, Dir, Helper);
|
return new ThunkChunkX64(S, Dir, Helper);
|
||||||
case I386:
|
case I386:
|
||||||
|
|
|
@ -108,7 +108,7 @@ LinkerDriver::parseDirectives(StringRef S) {
|
||||||
ErrorOr<Export> E = parseExport(Arg->getValue());
|
ErrorOr<Export> E = parseExport(Arg->getValue());
|
||||||
if (auto EC = E.getError())
|
if (auto EC = E.getError())
|
||||||
return EC;
|
return EC;
|
||||||
if (Config->MachineType == I386 && E->ExtName.startswith("_"))
|
if (Config->Machine == I386 && E->ExtName.startswith("_"))
|
||||||
E->ExtName = E->ExtName.substr(1);
|
E->ExtName = E->ExtName.substr(1);
|
||||||
Config->Exports.push_back(E.get());
|
Config->Exports.push_back(E.get());
|
||||||
break;
|
break;
|
||||||
|
@ -211,8 +211,8 @@ Undefined *LinkerDriver::addUndefined(StringRef Name) {
|
||||||
|
|
||||||
// Symbol names are mangled by appending "_" prefix on x86.
|
// Symbol names are mangled by appending "_" prefix on x86.
|
||||||
StringRef LinkerDriver::mangle(StringRef Sym) {
|
StringRef LinkerDriver::mangle(StringRef Sym) {
|
||||||
assert(Config->MachineType != IMAGE_FILE_MACHINE_UNKNOWN);
|
assert(Config->Machine != IMAGE_FILE_MACHINE_UNKNOWN);
|
||||||
if (Config->MachineType == IMAGE_FILE_MACHINE_I386)
|
if (Config->Machine == I386)
|
||||||
return Alloc.save("_" + Sym);
|
return Alloc.save("_" + Sym);
|
||||||
return Sym;
|
return Sym;
|
||||||
}
|
}
|
||||||
|
@ -335,7 +335,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
|
||||||
ErrorOr<MachineTypes> MTOrErr = getMachineType(Arg->getValue());
|
ErrorOr<MachineTypes> MTOrErr = getMachineType(Arg->getValue());
|
||||||
if (MTOrErr.getError())
|
if (MTOrErr.getError())
|
||||||
return false;
|
return false;
|
||||||
Config->MachineType = MTOrErr.get();
|
Config->Machine = MTOrErr.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle /nodefaultlib:<filename>
|
// Handle /nodefaultlib:<filename>
|
||||||
|
@ -529,20 +529,20 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
|
||||||
MachineTypes MT = File->getMachineType();
|
MachineTypes MT = File->getMachineType();
|
||||||
if (MT == IMAGE_FILE_MACHINE_UNKNOWN)
|
if (MT == IMAGE_FILE_MACHINE_UNKNOWN)
|
||||||
continue;
|
continue;
|
||||||
if (Config->MachineType == IMAGE_FILE_MACHINE_UNKNOWN) {
|
if (Config->Machine == IMAGE_FILE_MACHINE_UNKNOWN) {
|
||||||
Config->MachineType = MT;
|
Config->Machine = MT;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (Config->MachineType != MT) {
|
if (Config->Machine != MT) {
|
||||||
llvm::errs() << File->getShortName() << ": machine type "
|
llvm::errs() << File->getShortName() << ": machine type "
|
||||||
<< machineTypeToStr(MT) << " conflicts with "
|
<< machineToStr(MT) << " conflicts with "
|
||||||
<< machineTypeToStr(Config->MachineType) << "\n";
|
<< machineToStr(Config->Machine) << "\n";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Config->MachineType == IMAGE_FILE_MACHINE_UNKNOWN) {
|
if (Config->Machine == IMAGE_FILE_MACHINE_UNKNOWN) {
|
||||||
llvm::errs() << "warning: /machine is not specified. x64 is assumed.\n";
|
llvm::errs() << "warning: /machine is not specified. x64 is assumed.\n";
|
||||||
Config->MachineType = IMAGE_FILE_MACHINE_AMD64;
|
Config->Machine = AMD64;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Windows specific -- Convert Windows resource files to a COFF file.
|
// Windows specific -- Convert Windows resource files to a COFF file.
|
||||||
|
@ -559,8 +559,8 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
|
||||||
if (auto *Arg = Args.getLastArg(OPT_entry)) {
|
if (auto *Arg = Args.getLastArg(OPT_entry)) {
|
||||||
Config->Entry = addUndefined(mangle(Arg->getValue()));
|
Config->Entry = addUndefined(mangle(Arg->getValue()));
|
||||||
} else if (Args.hasArg(OPT_dll) && !Config->NoEntry) {
|
} else if (Args.hasArg(OPT_dll) && !Config->NoEntry) {
|
||||||
StringRef S = (Config->MachineType == I386) ? "__DllMainCRTStartup@12"
|
StringRef S = (Config->Machine == I386) ? "__DllMainCRTStartup@12"
|
||||||
: "_DllMainCRTStartup";
|
: "_DllMainCRTStartup";
|
||||||
Config->Entry = addUndefined(S);
|
Config->Entry = addUndefined(S);
|
||||||
} else if (!Config->NoEntry) {
|
} else if (!Config->NoEntry) {
|
||||||
// Windows specific -- If entry point name is not given, we need to
|
// Windows specific -- If entry point name is not given, we need to
|
||||||
|
@ -580,7 +580,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
|
||||||
ErrorOr<Export> E = parseExport(Arg->getValue());
|
ErrorOr<Export> E = parseExport(Arg->getValue());
|
||||||
if (E.getError())
|
if (E.getError())
|
||||||
return false;
|
return false;
|
||||||
if (Config->MachineType == I386 && !E->Name.startswith("_@?"))
|
if (Config->Machine == I386 && !E->Name.startswith("_@?"))
|
||||||
E->Name = mangle(E->Name);
|
E->Name = mangle(E->Name);
|
||||||
Config->Exports.push_back(E.get());
|
Config->Exports.push_back(E.get());
|
||||||
}
|
}
|
||||||
|
@ -600,7 +600,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
|
||||||
// Handle /delayload
|
// Handle /delayload
|
||||||
for (auto *Arg : Args.filtered(OPT_delayload)) {
|
for (auto *Arg : Args.filtered(OPT_delayload)) {
|
||||||
Config->DelayLoads.insert(StringRef(Arg->getValue()).lower());
|
Config->DelayLoads.insert(StringRef(Arg->getValue()).lower());
|
||||||
if (Config->MachineType == I386) {
|
if (Config->Machine == I386) {
|
||||||
Config->DelayLoadHelper = addUndefined("___delayLoadHelper2@8");
|
Config->DelayLoadHelper = addUndefined("___delayLoadHelper2@8");
|
||||||
} else {
|
} else {
|
||||||
Config->DelayLoadHelper = addUndefined("__delayLoadHelper2");
|
Config->DelayLoadHelper = addUndefined("__delayLoadHelper2");
|
||||||
|
@ -612,7 +612,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
|
||||||
Config->ImageBase = getDefaultImageBase();
|
Config->ImageBase = getDefaultImageBase();
|
||||||
|
|
||||||
Symtab.addRelative(mangle("__ImageBase"), 0);
|
Symtab.addRelative(mangle("__ImageBase"), 0);
|
||||||
if (Config->MachineType == IMAGE_FILE_MACHINE_I386) {
|
if (Config->Machine == I386) {
|
||||||
Config->SEHTable = Symtab.addRelative("___safe_se_handler_table", 0);
|
Config->SEHTable = Symtab.addRelative("___safe_se_handler_table", 0);
|
||||||
Config->SEHCount = Symtab.addAbsolute("___safe_se_handler_count", 0);
|
Config->SEHCount = Symtab.addAbsolute("___safe_se_handler_count", 0);
|
||||||
}
|
}
|
||||||
|
@ -653,7 +653,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Windows specific -- if __load_config_used can be resolved, resolve it.
|
// Windows specific -- if __load_config_used can be resolved, resolve it.
|
||||||
if (Config->MachineType == IMAGE_FILE_MACHINE_I386)
|
if (Config->Machine == I386)
|
||||||
if (Symbol *Sym = Symtab.find("__load_config_used"))
|
if (Symbol *Sym = Symtab.find("__load_config_used"))
|
||||||
if (isa<Lazy>(Sym->Body))
|
if (isa<Lazy>(Sym->Body))
|
||||||
Symtab.addUndefined("__load_config_used");
|
Symtab.addUndefined("__load_config_used");
|
||||||
|
|
|
@ -120,7 +120,7 @@ void printHelp(const char *Argv0);
|
||||||
|
|
||||||
// For /machine option.
|
// For /machine option.
|
||||||
ErrorOr<MachineTypes> getMachineType(StringRef Arg);
|
ErrorOr<MachineTypes> getMachineType(StringRef Arg);
|
||||||
StringRef machineTypeToStr(MachineTypes MT);
|
StringRef machineToStr(MachineTypes MT);
|
||||||
|
|
||||||
// Parses a string in the form of "<integer>[,<integer>]".
|
// Parses a string in the form of "<integer>[,<integer>]".
|
||||||
std::error_code parseNumbers(StringRef Arg, uint64_t *Addr,
|
std::error_code parseNumbers(StringRef Arg, uint64_t *Addr,
|
||||||
|
|
|
@ -82,11 +82,11 @@ private:
|
||||||
// Returns /machine's value.
|
// Returns /machine's value.
|
||||||
ErrorOr<MachineTypes> getMachineType(StringRef S) {
|
ErrorOr<MachineTypes> getMachineType(StringRef S) {
|
||||||
MachineTypes MT = StringSwitch<MachineTypes>(S.lower())
|
MachineTypes MT = StringSwitch<MachineTypes>(S.lower())
|
||||||
.Case("x64", IMAGE_FILE_MACHINE_AMD64)
|
.Case("x64", AMD64)
|
||||||
.Case("amd64", IMAGE_FILE_MACHINE_AMD64)
|
.Case("amd64", AMD64)
|
||||||
.Case("x86", IMAGE_FILE_MACHINE_I386)
|
.Case("x86", I386)
|
||||||
.Case("i386", IMAGE_FILE_MACHINE_I386)
|
.Case("i386", I386)
|
||||||
.Case("arm", IMAGE_FILE_MACHINE_ARMNT)
|
.Case("arm", ARMNT)
|
||||||
.Default(IMAGE_FILE_MACHINE_UNKNOWN);
|
.Default(IMAGE_FILE_MACHINE_UNKNOWN);
|
||||||
if (MT != IMAGE_FILE_MACHINE_UNKNOWN)
|
if (MT != IMAGE_FILE_MACHINE_UNKNOWN)
|
||||||
return MT;
|
return MT;
|
||||||
|
@ -94,13 +94,13 @@ ErrorOr<MachineTypes> getMachineType(StringRef S) {
|
||||||
return make_error_code(LLDError::InvalidOption);
|
return make_error_code(LLDError::InvalidOption);
|
||||||
}
|
}
|
||||||
|
|
||||||
StringRef machineTypeToStr(MachineTypes MT) {
|
StringRef machineToStr(MachineTypes MT) {
|
||||||
switch (MT) {
|
switch (MT) {
|
||||||
case IMAGE_FILE_MACHINE_ARMNT:
|
case ARMNT:
|
||||||
return "arm";
|
return "arm";
|
||||||
case IMAGE_FILE_MACHINE_AMD64:
|
case AMD64:
|
||||||
return "x64";
|
return "x64";
|
||||||
case IMAGE_FILE_MACHINE_I386:
|
case I386:
|
||||||
return "x86";
|
return "x86";
|
||||||
default:
|
default:
|
||||||
llvm_unreachable("unknown machine type");
|
llvm_unreachable("unknown machine type");
|
||||||
|
@ -428,7 +428,7 @@ std::error_code fixupExports() {
|
||||||
if (!E.ExtName.empty())
|
if (!E.ExtName.empty())
|
||||||
continue;
|
continue;
|
||||||
StringRef S = E.Sym->repl()->getName();
|
StringRef S = E.Sym->repl()->getName();
|
||||||
if (Config->MachineType == I386 && S.startswith("_"))
|
if (Config->Machine == I386 && S.startswith("_"))
|
||||||
S = S.substr(1);
|
S = S.substr(1);
|
||||||
E.ExtName = S;
|
E.ExtName = S;
|
||||||
}
|
}
|
||||||
|
@ -498,7 +498,7 @@ convertResToCOFF(const std::vector<MemoryBufferRef> &MBs) {
|
||||||
|
|
||||||
// Execute cvtres.exe.
|
// Execute cvtres.exe.
|
||||||
Executor E("cvtres.exe");
|
Executor E("cvtres.exe");
|
||||||
E.add("/machine:" + machineTypeToStr(Config->MachineType));
|
E.add("/machine:" + machineToStr(Config->Machine));
|
||||||
E.add("/readonly");
|
E.add("/readonly");
|
||||||
E.add("/nologo");
|
E.add("/nologo");
|
||||||
E.add("/out:" + Path);
|
E.add("/out:" + Path);
|
||||||
|
@ -551,7 +551,7 @@ std::error_code writeImportLibrary() {
|
||||||
|
|
||||||
Executor E("lib.exe");
|
Executor E("lib.exe");
|
||||||
E.add("/nologo");
|
E.add("/nologo");
|
||||||
E.add("/machine:" + machineTypeToStr(Config->MachineType));
|
E.add("/machine:" + machineToStr(Config->Machine));
|
||||||
E.add(Twine("/def:") + Def);
|
E.add(Twine("/def:") + Def);
|
||||||
if (Config->Implib.empty()) {
|
if (Config->Implib.empty()) {
|
||||||
SmallString<128> Out = StringRef(Config->OutputFile);
|
SmallString<128> Out = StringRef(Config->OutputFile);
|
||||||
|
|
|
@ -367,11 +367,11 @@ MachineTypes BitcodeFile::getMachineType() {
|
||||||
return IMAGE_FILE_MACHINE_UNKNOWN;
|
return IMAGE_FILE_MACHINE_UNKNOWN;
|
||||||
switch (Triple(M->getTargetTriple()).getArch()) {
|
switch (Triple(M->getTargetTriple()).getArch()) {
|
||||||
case Triple::x86_64:
|
case Triple::x86_64:
|
||||||
return IMAGE_FILE_MACHINE_AMD64;
|
return AMD64;
|
||||||
case Triple::x86:
|
case Triple::x86:
|
||||||
return IMAGE_FILE_MACHINE_I386;
|
return I386;
|
||||||
case Triple::arm:
|
case Triple::arm:
|
||||||
return IMAGE_FILE_MACHINE_ARMNT;
|
return ARMNT;
|
||||||
default:
|
default:
|
||||||
return IMAGE_FILE_MACHINE_UNKNOWN;
|
return IMAGE_FILE_MACHINE_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
|
@ -209,7 +209,7 @@ private:
|
||||||
unget();
|
unget();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config->MachineType == I386 && !E.Name.startswith("_@?"))
|
if (Config->Machine == I386 && !E.Name.startswith("_@?"))
|
||||||
E.Name = Alloc->save("_" + E.Name);
|
E.Name = Alloc->save("_" + E.Name);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
|
@ -287,7 +287,7 @@ StringRef SymbolTable::findMangle(StringRef Name) {
|
||||||
if (Symbol *Sym = find(Name))
|
if (Symbol *Sym = find(Name))
|
||||||
if (!isa<Undefined>(Sym->Body))
|
if (!isa<Undefined>(Sym->Body))
|
||||||
return Name;
|
return Name;
|
||||||
if (Config->MachineType != I386)
|
if (Config->Machine != I386)
|
||||||
return findByPrefix(("?" + Name + "@@Y").str());
|
return findByPrefix(("?" + Name + "@@Y").str());
|
||||||
if (!Name.startswith("_"))
|
if (!Name.startswith("_"))
|
||||||
return "";
|
return "";
|
||||||
|
|
|
@ -197,9 +197,9 @@ COFFSymbolRef DefinedCOFF::getCOFFSymbol() {
|
||||||
}
|
}
|
||||||
|
|
||||||
DefinedImportThunk::DefinedImportThunk(StringRef Name, DefinedImportData *S,
|
DefinedImportThunk::DefinedImportThunk(StringRef Name, DefinedImportData *S,
|
||||||
uint16_t MachineType)
|
uint16_t Machine)
|
||||||
: Defined(DefinedImportThunkKind, Name) {
|
: Defined(DefinedImportThunkKind, Name) {
|
||||||
switch (MachineType) {
|
switch (Machine) {
|
||||||
case AMD64:
|
case AMD64:
|
||||||
Data.reset(new ImportThunkChunkX64(S));
|
Data.reset(new ImportThunkChunkX64(S));
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -327,8 +327,7 @@ private:
|
||||||
// a regular name. A function pointer is given as a DefinedImportData.
|
// a regular name. A function pointer is given as a DefinedImportData.
|
||||||
class DefinedImportThunk : public Defined {
|
class DefinedImportThunk : public Defined {
|
||||||
public:
|
public:
|
||||||
DefinedImportThunk(StringRef Name, DefinedImportData *S,
|
DefinedImportThunk(StringRef Name, DefinedImportData *S, uint16_t Machine);
|
||||||
uint16_t MachineType);
|
|
||||||
|
|
||||||
static bool classof(const SymbolBody *S) {
|
static bool classof(const SymbolBody *S) {
|
||||||
return S->kind() == DefinedImportThunkKind;
|
return S->kind() == DefinedImportThunkKind;
|
||||||
|
|
|
@ -220,7 +220,7 @@ void Writer::createMiscChunks() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create SEH table. x86-only.
|
// Create SEH table. x86-only.
|
||||||
if (Config->MachineType != IMAGE_FILE_MACHINE_I386)
|
if (Config->Machine != I386)
|
||||||
return;
|
return;
|
||||||
std::set<Defined *> Handlers;
|
std::set<Defined *> Handlers;
|
||||||
for (ObjectFile *File : Symtab->ObjectFiles) {
|
for (ObjectFile *File : Symtab->ObjectFiles) {
|
||||||
|
@ -406,7 +406,7 @@ template <typename PEHeaderTy> void Writer::writeHeader() {
|
||||||
// Write COFF header
|
// Write COFF header
|
||||||
auto *COFF = reinterpret_cast<coff_file_header *>(Buf);
|
auto *COFF = reinterpret_cast<coff_file_header *>(Buf);
|
||||||
Buf += sizeof(*COFF);
|
Buf += sizeof(*COFF);
|
||||||
COFF->Machine = Config->MachineType;
|
COFF->Machine = Config->Machine;
|
||||||
COFF->NumberOfSections = OutputSections.size();
|
COFF->NumberOfSections = OutputSections.size();
|
||||||
COFF->Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE;
|
COFF->Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE;
|
||||||
if (Config->is64()) {
|
if (Config->is64()) {
|
||||||
|
@ -441,7 +441,7 @@ template <typename PEHeaderTy> void Writer::writeHeader() {
|
||||||
Defined *Entry = cast<Defined>(Config->Entry->repl());
|
Defined *Entry = cast<Defined>(Config->Entry->repl());
|
||||||
PE->AddressOfEntryPoint = Entry->getRVA();
|
PE->AddressOfEntryPoint = Entry->getRVA();
|
||||||
// Pointer to thumb code must have the LSB set, so adjust it.
|
// Pointer to thumb code must have the LSB set, so adjust it.
|
||||||
if (Config->MachineType == ARMNT)
|
if (Config->Machine == ARMNT)
|
||||||
PE->AddressOfEntryPoint |= 1;
|
PE->AddressOfEntryPoint |= 1;
|
||||||
}
|
}
|
||||||
PE->SizeOfStackReserve = Config->StackReserve;
|
PE->SizeOfStackReserve = Config->StackReserve;
|
||||||
|
|
Loading…
Reference in New Issue