From 913cf33f8df5749997ed5c38f18ee52b608bec0c Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 10 Jan 2024 23:37:53 +0100 Subject: [PATCH 1/2] Fix over-alignment of .eh_frame entries --- .../Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs index d0e147b28eb0d4..46103462354c08 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs @@ -82,7 +82,8 @@ private void WriteCie(DwarfCie cie) DwarfHelper.SizeOfULEB128(cie.ReturnAddressRegister) + (uint)(augmentationLength > 0 ? DwarfHelper.SizeOfULEB128(augmentationLength) + augmentationLength : 0) + (uint)cie.Instructions.Length; - uint padding = ((length + 7u) & ~7u) - length; + uint pointerEncodingSize = AddressSize(cie.PointerEncoding); + uint padding = ((length + pointerEncodingSize - 1u) & ~(pointerEncodingSize - 1u)) - length; _sectionWriter.WriteLittleEndian(length + padding - 4u); _sectionWriter.WriteLittleEndian(0); @@ -122,14 +123,16 @@ private void WriteFde(in DwarfFde fde, uint cieOffset) (fde.Cie.PersonalityEncoding != 0 ? AddressSize(fde.Cie.PersonalityEncoding) : 0) + (fde.Cie.LsdaEncoding != 0 ? AddressSize(fde.Cie.LsdaEncoding) : 0) : 0; + uint pointerEncodingSize = AddressSize(fde.Cie.PointerEncoding); + uint length = 4u + // Length 4u + // CIE offset - AddressSize(fde.Cie.PointerEncoding) + // PC start - AddressSize(fde.Cie.PointerEncoding) + // PC end + pointerEncodingSize + // PC start + pointerEncodingSize + // PC end augmentationLength + (uint)fde.Instructions.Length; - uint padding = ((length + 7u) & ~7u) - length; + uint padding = ((length + pointerEncodingSize - 1u) & ~(pointerEncodingSize - 1u)) - length; _sectionWriter.WriteLittleEndian(length + padding - 4u); _sectionWriter.WriteLittleEndian((uint)(_sectionWriter.Position - cieOffset)); From 7d42ec1e8ab661e7807ae5f6748cb70f118e522c Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Thu, 11 Jan 2024 09:36:15 +0100 Subject: [PATCH 2/2] PR feedback --- .../Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs index 46103462354c08..1705a10dd1ab15 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/Dwarf/DwarfEhFrame.cs @@ -43,6 +43,11 @@ public void AddFde(in DwarfFde fde) WriteFde(fde, cieOffset); } + private static uint PaddingSize(uint length, uint alignment) + { + return ((length + alignment - 1u) & ~(alignment - 1u)) - length; + } + private void WriteCie(DwarfCie cie) { Utf8StringBuilder augmentationString = new Utf8StringBuilder(); @@ -82,8 +87,7 @@ private void WriteCie(DwarfCie cie) DwarfHelper.SizeOfULEB128(cie.ReturnAddressRegister) + (uint)(augmentationLength > 0 ? DwarfHelper.SizeOfULEB128(augmentationLength) + augmentationLength : 0) + (uint)cie.Instructions.Length; - uint pointerEncodingSize = AddressSize(cie.PointerEncoding); - uint padding = ((length + pointerEncodingSize - 1u) & ~(pointerEncodingSize - 1u)) - length; + uint padding = PaddingSize(length, AddressSize(cie.PointerEncoding)); _sectionWriter.WriteLittleEndian(length + padding - 4u); _sectionWriter.WriteLittleEndian(0); @@ -124,7 +128,6 @@ private void WriteFde(in DwarfFde fde, uint cieOffset) (fde.Cie.LsdaEncoding != 0 ? AddressSize(fde.Cie.LsdaEncoding) : 0) : 0; uint pointerEncodingSize = AddressSize(fde.Cie.PointerEncoding); - uint length = 4u + // Length 4u + // CIE offset @@ -132,7 +135,7 @@ private void WriteFde(in DwarfFde fde, uint cieOffset) pointerEncodingSize + // PC end augmentationLength + (uint)fde.Instructions.Length; - uint padding = ((length + pointerEncodingSize - 1u) & ~(pointerEncodingSize - 1u)) - length; + uint padding = PaddingSize(length, pointerEncodingSize); _sectionWriter.WriteLittleEndian(length + padding - 4u); _sectionWriter.WriteLittleEndian((uint)(_sectionWriter.Position - cieOffset));