Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix RVA field alignment #888

Merged
merged 6 commits into from
Jan 18, 2023
Merged

Conversation

sbomer
Copy link
Contributor

@sbomer sbomer commented Dec 27, 2022

Upstreaming the change from dotnet#55.

Fixes dotnet/runtime#79477, specifically, the problem described in dotnet/runtime#79477 (comment).

This ensures that section starts are aligned by adjusting the previous Range's length to ensure the computed start of a new Range meets the alignment requirements. It was done this way rather than just computing an aligned start for the new Range, because the TextMap assumes that the Ranges are contiguous - see for example GetNextRVA.

@sbomer
Copy link
Contributor Author

sbomer commented Dec 27, 2022

@jbevain I'm updating the pipeline to use ubuntu-20.04 instead of ubuntu-latest. The ubuntu job was failing because the ubuntu-latest images no longer include the older versions of .NET Core: actions/runner-images#6399.

Testhost process for source(s) '/home/runner/work/cecil/cecil/symbols/mdb/Test/bin/Debug/netcoreapp3.1/Mono.Cecil.Mdb.Tests.dll' exited with error: You must install or update .NET to run this application.
App: /home/runner/.nuget/packages/microsoft.testplatform.testhost/15.9.0/lib/netstandard1.5/testhost.dll
Architecture: x64
Framework: 'Microsoft.NETCore.App', version '3.1.0' (x64)
.NET location: /usr/share/dotnet/
The following frameworks were found:
  6.0.11 at [/usr/share/dotnet/shared/Microsoft.NETCore.App]
  7.0.0 at [/usr/share/dotnet/shared/Microsoft.NETCore.App]

The windows job is also failing when running peverify on some unrelated exes in this repo:

Failed X64Module [61 ms]
  Error Message:
   [IL]: Error: [C:\Users\runneradmin\AppData\Local\Temp\cecil-drt\hello.x64.exe : Program::.ctor]  [HRESULT 0x8007000B] - An attempt was made to load a program with an incorrect format.[IL]: Error: [C:\Users\runneradmin\AppData\Local\Temp\cecil-drt\hello.x64.exe : Program::Main]  [HRESULT 0x8007000B] - An attempt was made to load a program with an incorrect format.2 Error(s) Verifying C:\Users\runneradmin\AppData\Local\Temp\cecil-drt\hello.x64.exe
  Stack Trace:
     at Mono.Cecil.Tests.CompilationService.Verify(String name) in D:\a\cecil\cecil\Test\Mono.Cecil.Tests\CompilationService.cs:line 123
   at Mono.Cecil.Tests.TestRunner.RoundTrip(String location, ReaderParameters reader_parameters, String folder) in D:\a\cecil\cecil\Test\Mono.Cecil.Tests\BaseTestFixture.cs:line 326
   at Mono.Cecil.Tests.TestRunner.GetModule() in D:\a\cecil\cecil\Test\Mono.Cecil.Tests\BaseTestFixture.cs:line 275
   at Mono.Cecil.Tests.TestRunner.RunTest() in D:\a\cecil\cecil\Test\Mono.Cecil.Tests\BaseTestFixture.cs:line 333
   at Mono.Cecil.Tests.BaseTestFixture.Run(TestCase testCase) in D:\a\cecil\cecil\Test\Mono.Cecil.Tests\BaseTestFixture.cs:line 152
   at Mono.Cecil.Tests.BaseTestFixture.TestModule(String file, Action`1 test, Boolean verify, Boolean readOnly, Type symbolReaderProvider, Type symbolWriterProvider, IAssemblyResolver assemblyResolver, Boolean applyWindowsRuntimeProjections, String sourceFilePath) in D:\a\cecil\cecil\Test\Mono.Cecil.Tests\BaseTestFixture.cs:line 127
   at Mono.Cecil.Tests.ImageReadTests.X64Module() in D:\a\cecil\cecil\Test\Mono.Cecil.Tests\ImageReadTests.cs:line 97

I'm not sure why this is - it appears unrelated to this recent change to windows-latest, since it fails the same way when using windows-2019.

This wasn't aligned to begin with. Attempting to align it causes problems
due to the way CodeWriter gets the code RVA - it computes the RVA
from the CLI Header length, which doesn't take into account the code's
alignment requirements.
@sbomer
Copy link
Contributor Author

sbomer commented Jan 10, 2023

Fixed the test failures, which were of course related to my change (I had somehow convinced myself they were unrelated, but in retrospect it is obvious). The problem was the use of GetNextRVA to compute the Code RVA, before adding that segment to the TextMap.

@jbevain jbevain merged commit 870ce3e into jbevain:master Jan 18, 2023
@jbevain
Copy link
Owner

jbevain commented Jan 18, 2023

Thanks @sbomer!

jonpryor pushed a commit to dotnet/android that referenced this pull request Jul 3, 2024
Context: #9043

Changes: jbevain/cecil@0.11.4...0.11.5

  * jbevain/cecil@8c123e1: Bump to 0.11.5
  * jbevain/cecil@870ce3e: Fix RVA field alignment (jbevain/cecil#888)
  * jbevain/cecil@4ad9c0f: Fix that method resolution would consider all function-pointers to be the same (jbevain/cecil#885)
  * jbevain/cecil@cc48622: Fix a StackOverflowException reading windows runtime assemblies. (jbevain/cecil#879)
  * jbevain/cecil@341fb14: Treat instance and static methods as different methods during resolution (jbevain/cecil#882)
  * jbevain/cecil@e052ab5: Address issue #873 (jbevain/cecil#874)
  * jbevain/cecil@92f32da: Add `MethodImplAttributes.AggressiveOptimization` (jbevain/cecil#855)
  * jbevain/cecil@c4cfe16: Fix a race condition between certain Has properties and their collection property. (jbevain/cecil#843)
  * jbevain/cecil@65a2912: Add more style configuration (jbevain/cecil#854)
  * jbevain/cecil@9eb00e4: ILProcessor should also update custom debug info (jbevain/cecil#867)
  * jbevain/cecil@7d36386: Fix corrupted debug header directory entry when writing multiple such entries. (jbevain/cecil#869)
  * jbevain/cecil@6f94613: InvariantCulture for operand to string conversion in Instruction.ToString() (jbevain/cecil#870)
  * jbevain/cecil@42b9ef1: Add support for generic attributes (jbevain/cecil#871)
  * jbevain/cecil@49b1c52: Add `Unmanaged` calling convention (jbevain/cecil#852)
  * jbevain/cecil@2c68927: Fix mixed module ReadSymbols() (jbevain/cecil#851)
  * jbevain/cecil@f7b64f7: Fix custom attribute with enum on generic type (jbevain/cecil#827)
  * jbevain/cecil@79b43e8: Fix deterministic MVID and add PdbChecksum (jbevain/cecil#810)
  * jbevain/cecil@8b593d5: Harden debug scope update logic (jbevain/cecil#824)
  * jbevain/cecil@a56b5bd: FieldRVA alignment (jbevain/cecil#817)
  * jbevain/cecil@75372c7: Switch to netcoreapp3.1 for tests (jbevain/cecil#823)
  * jbevain/cecil@5f69faa: Add support for generating the method and generic method comment signature with nested types (jbevain/cecil#801)
  * jbevain/cecil@a0a6ce4: Addressing issue #781 (jbevain/cecil#782)
  * jbevain/cecil@2f1077d: Update the version of Microsoft.NETFramework.ReferenceAssemblies.net40 (jbevain/cecil#787)
  * jbevain/cecil@ede17f9: Fix handling of empty string constants (jbevain/cecil#776)

#9043 stops building API-34 and makes API-35 stable,
and in attempting to do so encounters this error when running
all of the in-tree Windows smoke tests on CI:

	D:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\35.0.0-ci.pr.gh9043.6\tools\Xamarin.Android.Bindings.JavaDependencyVerification.targets(22,5):
	error MSB4062: The "Xamarin.Android.Tasks.GetMicrosoftNuGetPackagesMap" task could not be loaded from the assembly 
	D:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\35.0.0-ci.pr.gh9043.6\tools\Xamarin.Android.Build.Tasks.dll.
	Could not load file or assembly 'Mono.Cecil, Version=0.11.4.0, Culture=neutral, PublicKeyToken=50cebf1cceb9d05e'.
	The system cannot find the file specified.
	Confirm that the <UsingTask> declaration is correct, that the assembly and all its dependencies are available,
	  and that the task contains a public class that implements Microsoft.Build.Framework.ITask.
	[D:\a\_work\1\a\TestRelease\07-02_16.40.15\temp\DotNetBuildandroid-armFalseFalseFalse\UnnamedProject.csproj]

This appears to be caused by the fact that previously we:

 1. Build `Microsoft.Android.Sdk.ILLink.csproj`, which pulls in
    [Microsoft.NET.ILLink/9.0.0-preview.6.24319.11][0], which pulls
    in [Microsoft.DotNet.Cecil/0.11.4-alpha.24313.1][1], which
    contains `Mono.Cecil.dll` versioned as 0.11.5.0.

    (Yes, it's "odd" that `Microsoft.DotNet.Cecil/0.11.4*` would
    contain a Cecil versioned as 0.11.5, but that's what it has!)

 2. Build the rest of dotnet/android with the
    [Mono.Cecil/0.11.4][2] package.

 3. The Mono.Cecil/0.11.4 package "wins" and ends up in the output
    directory and the sdk pack.

So long as the `ILLink*`-related assemblies don't use any
Mono.Cecil/0.11.5 APIs, this works, however it is risky because we
don't know exactly what API `ILLink*` uses.

#9043 appears to change the build order such that
Mono.Cecil/0.11.5 now "wins" and is in the output directory.
This causes the above MSB4062 assembly load error.

We could try to fix the ordering and make Mono.Cecil/0.11.4 "win",
but this leaves us vulnerable to missing some API that `ILLink*`
needs.  As such, it's better that we update the rest of dotnet/android
to use the `0.11.5` version of `Mono.Cecil`.

This update breaks the `LinkerTests.FixAbstractMethodsStep_Explicit()`
unit test.  Specifically, this logic now returns `null` instead of
being able to be resolved:

	new MethodReference (iface_method.Name, void_type, iface)
	    .Resolve ();

It feels like this makes sense: a method name and return type doesn't
seem like it would be enough to resolve, as parameters are not
considered.

The fix is simply to use the existing `MethodDefinition` as the
`MethodReference`, there is no reason to create a new one.
This change fixes the test.

[0]: https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet9-transport/NuGet/Microsoft.NET.ILLink/overview/9.0.0-preview.7.24328.10
[1]: https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet9-transport/NuGet/Microsoft.DotNet.Cecil/overview/0.11.4-alpha.24313.1
[2]: https://www.nuget.org/packages/Mono.Cecil/0.11.4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

RuntimeHelpers.CreateSpan support is failing in some circumstances
2 participants