[lld] [LLD][COFF] Add support for alternate entry point in CHPE metadata on ARM64X (PR #123346)
Jacek Caban via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 18 05:00:11 PST 2025
================
@@ -1235,17 +1240,31 @@ void DynamicRelocsChunk::writeTo(uint8_t *buf) const {
header->Symbol = IMAGE_DYNAMIC_RELOCATION_ARM64X;
buf += sizeof(*header);
- auto pageHeader = reinterpret_cast<coff_base_reloc_block_header *>(buf);
- pageHeader->BlockSize = sizeof(*pageHeader);
+ coff_base_reloc_block_header *pageHeader = nullptr;
+ size_t relocSize = 0;
for (const Arm64XDynamicRelocEntry &entry : arm64xRelocs) {
- entry.writeTo(buf + pageHeader->BlockSize);
- pageHeader->BlockSize += entry.getSize();
+ uint32_t page = entry.offset.get() & ~0xfff;
+ if (!pageHeader || page != pageHeader->PageRVA) {
+ relocSize = alignTo(relocSize, sizeof(uint32_t));
+ if (pageHeader)
+ pageHeader->BlockSize =
+ buf + relocSize - reinterpret_cast<uint8_t *>(pageHeader);
+ pageHeader =
+ reinterpret_cast<coff_base_reloc_block_header *>(buf + relocSize);
+ pageHeader->PageRVA = page;
+ relocSize += sizeof(*pageHeader);
+ }
+
+ entry.writeTo(buf + relocSize);
+ relocSize += entry.getSize();
}
- pageHeader->BlockSize = alignTo(pageHeader->BlockSize, sizeof(uint32_t));
+ relocSize = alignTo(relocSize, sizeof(uint32_t));
+ pageHeader->BlockSize =
----------------
cjacek wrote:
Yes, every ARM64X image will have at least one relocation for the machine field in the PE header. If other types of dynamic relocations are used in the future, this whole chunk code will have to be skipped anyway.
https://github.com/llvm/llvm-project/pull/123346
More information about the llvm-commits
mailing list