Skip to content

Commit 6c06a07

Browse files
committed
[JITLink] Process null symbols
Some relocations (e.g., R_RISCV_ALIGN) don't have a target symbol and use a null symbol as a placeholder. These symbols were not processed before making it impossible to create edges for them. This patch tries to detect these null symbols and create absolute symbols for them. Note that technically, these null symbols are UND in the ELF file, not ABS, so it might make more consistent to create a new symbol type for this (local undefined or so). However, since these symbols are only used as placeholders (i.e., their values are never used), I don't think it's worth the effort of doing this. Also note that in the binaries that I have inspected, this null symbol always has index 0. Could it make sense to add that to the test to avoid accidentally adding unnecessary symbols? The reason I didn't do this yet, is that I couldn't find any references in the specs that actually guarantee this. Reviewed By: lhames Differential Revision: https://reviews.llvm.org/D149541
1 parent 8a5a120 commit 6c06a07

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,21 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySymbols() {
540540
auto &GSym = G->addExternalSymbol(*Name, Sym.st_size,
541541
Sym.getBinding() == ELF::STB_WEAK);
542542
setGraphSymbol(SymIndex, GSym);
543+
} else if (Sym.isUndefined() && Sym.st_value == 0 && Sym.st_size == 0 &&
544+
Sym.getType() == ELF::STT_NOTYPE &&
545+
Sym.getBinding() == ELF::STB_LOCAL && Name->empty()) {
546+
// Some relocations (e.g., R_RISCV_ALIGN) don't have a target symbol and
547+
// use this kind of null symbol as a placeholder.
548+
LLVM_DEBUG({
549+
dbgs() << " " << SymIndex << ": Creating null graph symbol\n";
550+
});
551+
552+
auto SymName =
553+
G->allocateContent("__jitlink_ELF_SYM_UND_" + Twine(SymIndex));
554+
auto SymNameRef = StringRef(SymName.data(), SymName.size());
555+
auto &GSym = G->addAbsoluteSymbol(SymNameRef, orc::ExecutorAddr(0), 0,
556+
Linkage::Strong, Scope::Local, false);
557+
setGraphSymbol(SymIndex, GSym);
543558
} else {
544559
LLVM_DEBUG({
545560
dbgs() << " " << SymIndex

0 commit comments

Comments
 (0)