[llvm] [BOLT] Support runtime library hook via DT_INIT_ARRAY (PR #167467)
Vasily Leonenko via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 25 07:57:01 PST 2025
================
@@ -1448,26 +1536,101 @@ Error RewriteInstance::discoverRtFiniAddress() {
"No relocation for first DT_FINI_ARRAY slot");
}
-void RewriteInstance::updateRtFiniReloc() {
+Error RewriteInstance::updateRtInitReloc() {
+ if (BC->HasInterpHeader && opts::RuntimeLibInitHook == opts::RLIH_ENTRY_POINT)
+ return Error::success();
+
+ // Updating DT_INIT is handled by patchELFDynamic.
+ if (BC->InitAddress && opts::RuntimeLibInitHook <= opts::RLIH_INIT)
+ return Error::success();
+
+ const RuntimeLibrary *RT = BC->getRuntimeLibrary();
+ if (!RT || !RT->getRuntimeStartAddress())
+ return Error::success();
+
+ if (!BC->InitArrayAddress)
+ return Error::success();
+
+ if (!BC->InitArrayAddress || !BC->InitArraySize)
+ return createStringError(std::errc::not_supported,
+ "inconsistent .init_array state");
+
+ ErrorOr<BinarySection &> InitArraySection =
+ BC->getSectionForAddress(*BC->InitArrayAddress);
+ if (!InitArraySection)
+ return createStringError(std::errc::not_supported, ".init_array removed");
+
+ if (std::optional<Relocation> Reloc =
+ InitArraySection->takeDynamicRelocationAt(0)) {
+ if (Reloc->isRelative()) {
+ if (Reloc->Addend != BC->StartFunctionAddress)
+ return createStringError(std::errc::not_supported,
+ "inconsistent .init_array dynamic relocation");
+ Reloc->Addend = RT->getRuntimeStartAddress();
+ InitArraySection->addDynamicRelocation(*Reloc);
+ } else {
+ MCSymbol *Sym = Reloc->Symbol;
+ if (!Sym)
+ return createStringError(
+ std::errc::not_supported,
+ "Failed to locate symbol for 0 entry of .init_array");
+ const BinaryFunction *BF = BC->getFunctionForSymbol(Sym);
+ if (!BF)
+ return createStringError(
+ std::errc::not_supported,
+ "Failed to locate binary function for 0 entry of .init_array");
+ if (BF->getAddress() + Reloc->Addend != BC->StartFunctionAddress)
+ return createStringError(std::errc::not_supported,
+ "inconsistent .init_array dynamic relocation");
+ InitArraySection->addDynamicRelocation(Relocation{
+ /*Offset*/ 0, /*Symbol*/ nullptr, /*Type*/ Relocation::getAbs64(),
+ /*Addend*/ RT->getRuntimeStartAddress(), /*Value*/ 0});
+ }
+ }
+ // Update the static relocation by adding a pending relocation which will get
+ // patched when flushPendingRelocations is called in rewriteFile. Note that
+ // flushPendingRelocations will calculate the value to patch as
+ // "Symbol + Addend". Since we don't have a symbol, just set the addend to the
+ // desired value.
+ InitArraySection->addPendingRelocation(Relocation{
+ /*Offset*/ 0, /*Symbol*/ nullptr, /*Type*/ Relocation::getAbs64(),
+ /*Addend*/ RT->getRuntimeStartAddress(), /*Value*/ 0});
+ outs() << "BOLT-INFO: Runtime library initialization was hooked via 1st "
----------------
vleonen wrote:
Done for this and other similar comments
https://github.com/llvm/llvm-project/pull/167467
More information about the llvm-commits
mailing list