[ELF] Add a dummySym member to Ctx
This ensures subsequent calls to elf::postScanRelocations with a new Ctx will correctly use an instance with the right internalFile (with the old one presumably deleted, even). It also avoids having to create a new instance in elf::getErrorPlace, and will allow more uses of such a dummy symbol in future commits. Reviewers: MaskRay Reviewed By: MaskRay Pull Request: https://github.com/llvm/llvm-project/pull/150796
This commit is contained in:
parent
75e5a70577
commit
58e6bc87b7
@ -702,6 +702,8 @@ struct Ctx : CommonLinkerContext {
|
||||
std::unique_ptr<llvm::TarWriter> tar;
|
||||
// InputFile for linker created symbols with no source location.
|
||||
InputFile *internalFile = nullptr;
|
||||
// Dummy Undefined for relocations without a symbol.
|
||||
Undefined *dummySym = nullptr;
|
||||
// True if symbols can be exported (isExported) or preemptible.
|
||||
bool hasDynsym = false;
|
||||
// True if SHT_LLVM_SYMPART is used.
|
||||
|
@ -3140,6 +3140,7 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &args) {
|
||||
ctx.symtab->insert(arg->getValue())->traced = true;
|
||||
|
||||
ctx.internalFile = createInternalFile(ctx, "<internal>");
|
||||
ctx.dummySym = make<Undefined>(ctx.internalFile, "", STB_LOCAL, 0, 0);
|
||||
|
||||
// Handle -u/--undefined before input files. If both a.a and b.so define foo,
|
||||
// -u foo a.a b.so will extract a.a.
|
||||
|
@ -1948,13 +1948,12 @@ void elf::postScanRelocations(Ctx &ctx) {
|
||||
|
||||
GotSection *got = ctx.in.got.get();
|
||||
if (ctx.needsTlsLd.load(std::memory_order_relaxed) && got->addTlsIndex()) {
|
||||
static Undefined dummy(ctx.internalFile, "", STB_LOCAL, 0, 0);
|
||||
if (ctx.arg.shared)
|
||||
ctx.mainPart->relaDyn->addReloc(
|
||||
{ctx.target->tlsModuleIndexRel, got, got->getTlsIndexOff()});
|
||||
else
|
||||
got->addConstant({R_ADDEND, ctx.target->symbolicRel,
|
||||
got->getTlsIndexOff(), 1, &dummy});
|
||||
got->getTlsIndexOff(), 1, ctx.dummySym});
|
||||
}
|
||||
|
||||
assert(ctx.symAux.size() == 1);
|
||||
|
@ -105,10 +105,9 @@ ErrorPlace elf::getErrorPlace(Ctx &ctx, const uint8_t *loc) {
|
||||
if (isecLoc <= loc && loc < isecLoc + isec->getSize()) {
|
||||
std::string objLoc = isec->getLocation(loc - isecLoc);
|
||||
// Return object file location and source file location.
|
||||
Undefined dummy(ctx.internalFile, "", STB_LOCAL, 0, 0);
|
||||
ELFSyncStream msg(ctx, DiagLevel::None);
|
||||
if (isec->file)
|
||||
msg << isec->getSrcMsg(dummy, loc - isecLoc);
|
||||
msg << isec->getSrcMsg(*ctx.dummySym, loc - isecLoc);
|
||||
return {isec, objLoc + ": ", std::string(msg.str())};
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user