From 789699928abbaaf83c24cbfb9bd60d3aa6313371 Mon Sep 17 00:00:00 2001 From: boykopovar Date: Tue, 8 Sep 2026 00:15:54 +0300 Subject: [PATCH] fix(relinker): gen r_x86_64_relative relocs for internal ptrs --- .../src/pipeline/RelinkerPipeline.cpp | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/core/relinker/src/pipeline/RelinkerPipeline.cpp b/core/relinker/src/pipeline/RelinkerPipeline.cpp index a4442f4c3..d8ee463c6 100644 --- a/core/relinker/src/pipeline/RelinkerPipeline.cpp +++ b/core/relinker/src/pipeline/RelinkerPipeline.cpp @@ -198,6 +198,34 @@ RelinkResult RelinkerPipeline::Relink(const std::vector& sourceElf auto dynSection = _dynamicSectionBuilder->BuildDynamicSection(nidRefs, neededLibraries); + static constexpr std::uint32_t R_X86_64_RELATIVE = 8; + + auto appendRela = [&](std::vector& buf, std::uint64_t offset, std::uint64_t info, std::int64_t addend) { + std::size_t pos = buf.size(); + buf.resize(pos + 24); + std::memcpy(buf.data() + pos, &offset, 8); + std::memcpy(buf.data() + pos + 8, &info, 8); + std::memcpy(buf.data() + pos + 16, &addend, 8); + }; + + auto extractRelative = [&](const FileByteOffset relaOff, const ByteCount relaSize) { + for (ByteCount off = 0; off + relaEntSize <= relaSize; off += relaEntSize) { + const FileByteOffset pos = relaOff + off; + std::uint64_t rOffset = 0, rInfo = 0; + std::int64_t rAddend = 0; + std::memcpy(&rOffset, raw.data() + pos, 8); + std::memcpy(&rInfo, raw.data() + pos + 8, 8); + std::memcpy(&rAddend, raw.data() + pos + 16, 8); + const std::uint32_t symIdx = static_cast(rInfo >> 32); + const std::uint32_t relType = static_cast(rInfo & 0xffffffff); + if (symIdx == 0 && relType == R_X86_64_RELATIVE) + appendRela(dynSection.RelaData, rOffset, static_cast(R_X86_64_RELATIVE), rAddend); + } + }; + + extractRelative(dynRelaOffset, dynRelaSize); + extractRelative(dynJmpRelOffset, dynJmpRelSize); + std::vector entries; entries.reserve(nidRefs.size()); for (const auto& ref : nidRefs) {