[browser][coreCLR] Loading WebCIL 1.0#124268
[browser][coreCLR] Loading WebCIL 1.0#124268pavelsavara wants to merge 29 commits intodotnet:mainfrom
Conversation
|
Tagging subscribers to this area: @agocke, @jeffschwMSFT, @elinor-fung |
There was a problem hiding this comment.
Pull request overview
This PR adds support for loading WebCIL version 1.0 assemblies in CoreCLR on browser/WASM targets. WebCIL is an alternative container format for ECMA-335 assemblies that strips PE headers and packages assemblies as WebAssembly modules with a .wasm extension, helping avoid issues with firewalls/antivirus software that block .dll files.
Changes:
- Added
WebCILImageLayoutC++ class that extendsPEImageLayoutto handle WebCIL format, parsing WebCIL headers and mapping RVAs to file offsets - Implemented
instantiateWebCILModulein TypeScript that instantiates WebCIL .wasm modules and extracts assembly payloads into aligned memory - Enabled WebCIL support for CoreCLR by removing
WasmEnableWebcil=falserestrictions and updating test configurations
Reviewed changes
Copilot reviewed 17 out of 18 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| src/native/libs/Common/JavaScript/types/public-api.ts | Added "webcil1" asset behavior type |
| src/native/libs/Common/JavaScript/types/exchange.ts | Added instantiateWebCILModule to BrowserHost exports |
| src/native/libs/Common/JavaScript/cross-module/index.ts | Updated export table to include instantiateWebCILModule |
| src/native/corehost/browserhost/loader/dotnet.d.ts | Added "webcil1" type definition |
| src/native/corehost/browserhost/loader/assets.ts | Added WebCIL detection and loading logic, mapping .wasm to .dll paths |
| src/native/corehost/browserhost/host/index.ts | Exported instantiateWebCILModule function |
| src/native/corehost/browserhost/host/host.ts | Updated assembly path mapping to replace .wasm with .dll |
| src/native/corehost/browserhost/host/assets.ts | Implemented instantiateWebCILModule to extract WebCIL payload and register assemblies |
| src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.cs | Removed CoreCLR restriction for WebCIL in tests |
| src/mono/browser/build/WasmApp.InTree.props | Removed WasmEnableWebcil=false for CoreCLR, updated TODO comment |
| src/coreclr/vm/webcildecoder.cpp | New file implementing WebCILImageLayout class for parsing and validating WebCIL format |
| src/coreclr/vm/peimagelayout.h | Added WebCIL header structures and WebCILImageLayout class declaration |
| src/coreclr/vm/peimagelayout.cpp | Added WebCIL format detection in LoadFlat |
| src/coreclr/vm/peassembly.cpp | Excluded 32-bit NT headers check for TARGET_BROWSER, added braces for consistency |
| src/coreclr/vm/coreassemblyspec.cpp | Added braces around single-statement if bodies |
| src/coreclr/vm/CMakeLists.txt | Added webcildecoder.cpp to browser build |
| src/coreclr/inc/pedecoder.h | Made specific PEDecoder methods virtual for browser target to enable WebCILImageLayout overrides |
| eng/testing/tests.browser.targets | Removed WasmEnableWebcil=false for CoreCLR, updated TODO comment |
|
Please have @elinor-fung look at this |
5adef6d to
102345a
Compare
I haven't done any testing of R2R so far for windows or ios and so I don't have as much context there. However, it sounds like automated tests are generally executed with If we implement support in corerun, would we then be able to do something like, // No external dependencies besides corlib
class WasmTest
{
public static void Main()
{
CodegenTestEntrypoint();
}
} |
In corerun, we don't have the implementation of That said, is there more feedback for this PR ? |
# Conflicts: # src/native/libs/Common/JavaScript/host/assets.ts # src/native/libs/Common/JavaScript/host/host.ts # src/native/libs/Common/JavaScript/types/exchange.ts
Definitely agreed that it is out of scope for this PR! I was mostly just wanting to understand what direction we are heading in on the host loading side and what work is still required, so I appreciate the clarification here. I don't have any more feedback, and I think this looks good for now as a start! Since I have limited expertise in this area though, it would be great if @elinor-fung could take a look before this goes in. |
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.cs
Outdated
Show resolved
Hide resolved
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ComputeWasmPublishAssets.cs
Show resolved
Hide resolved
Co-authored-by: Copilot <[email protected]>
As we are waiting for more feedback on native part, I split of JS part, for which I'm pretty confident into #124758 and will merge that first. |
Enable WebCIL support for CoreCLR on Browser/WASM
Fixes #120248
WebCIL format v1.0 with 16-byte section alignment and IMAGE_SECTION_HEADER format
Bumps WebCIL version from 0.0 to 1.0.
WebcilConverternow emits section data at 16-byte-aligned offsets, ensuring RVA static fields backingReadOnlySpan<T>over types up toVector128<T>retain their natural alignment.IMAGE_SECTION_HEADERthat makes the code of reading much simpler.CoreCLR PEDecoder: native WebCIL parsing
New
src/coreclr/inc/webcil.hdefinesWebcilHeaderandWebcilSectionHeaderC structs withstatic_assertsize checks.PEDecodergains:FLAG_WEBCILflag;HasWebcilHeaders()validates magic, version, section count/bounds/ordering and synthesizesIMAGE_SECTION_HEADER[]from WebCIL sections soRvaToSection()/RvaToOffset()work uniformly.HasHeaders()/CheckHeaders()as unified entry points that dispatch to WebCIL or NT paths.HasDirectoryEntry(),GetDirectoryEntryData()(handlesCOMHEADERandDEBUGentries viaWebcilHeaderfields with explicit range validation against section data).CheckCorHeader()andCheckILOnly()WebCIL branches (WebCIL images are always IL-only by definition).GetPEKindAndMachine()reportspeILonly/IMAGE_FILE_MACHINE_I386for WebCIL.GetNumberOfRvaAndSizes()moved from public to private API;GetNumberOfSections()/FindFirstSection()delegate to synthesized headers for WebCIL.CheckNTHeaders()toCheckHeaders()/HasHeaders().PEImage / PEAssembly integration
PEImageexposesHasHeaders()forwarding toPEDecoder::HasHeaders().PEAssemblyusesHasHeaders()instead ofHasNTHeaders()for metadata access.Browser host loader: WebCIL module instantiation
instantiateWebCILModule()in host assets:.wasmwrapper as a WebAssembly modulegetWebcilSize/getWebcilPayloadexports to extract the raw WebCIL.dllvirtual path.getWasmMemory/getWasmTableWasmEnableWebcil.DAC support gap
All WebCIL code paths in
PEDecoderare gated behind#ifdef TARGET_BROWSER, which is mutually exclusive withDACCESS_COMPILE.Should we drop
#ifdef TARGET_BROWSER? Or build target specific DAC binaries ?Follow up in #124467