bytecodealliance / bytecodealliance/componentize-dotnet

Referencing a project that exposes WIT bindings gives linker error

Open
#92 3 comments 0 reactions 0 assignees View on GitHub
Dominant language
C#
Stars
147
Forks
18
PR merge metrics
No merged PRs in 30d

Description

**Background**: I am interested in compiling F# to a WASM component. So far, I've managed to get a simple WASI "Hello, world!" program compiling and running using componentize-dotnet. For the next step, I wanted to access host bindings exposed via a WIT file. Since `wit-bindgen` generates C#, and not F# source files, it does not seem like I can do this directly from F#.

What I have experimented so far is creating a new C# Project which imports the wit file, and then reference this C# project from F#. With this setup, the auto-generated host bindings seem to be accessible to F#. However, I get some kind of link error when trying to build the project:
```rust
error: failed to encode component

Caused by:
0: failed to decode world from module
1: module was not valid
2: no top-level imported function `foobar` specified
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
Here, `foobar` is a function that I am exposing from my wit file:
```wit
package example:host;
world host {
import foobar: func ();
}
```

This error only occurs when actually calling `HostWorld.exports.HostWorld.Foobar ()` somewhere from the F# project or from the C# project.

Is there some combination of configurations that could make this setup work? If there is, it would be nice for this to be documented somewhere since I could not find any relevant information.

Environment:
- `BytecodeAlliance.Componentize.DotNet.Wasm.SDK`: 0.7.0-preview00010
- `runtime.linux-x64.microsoft.dotnet.ilcompiler.llvm`: 10.0.0-alpha.1.25162.1
- OS: Linux x64
- .NET: 10.0.100-preview.6

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the build with the WIT file defining the `host` world and its imported `foobar` function, then inspect the C# project that imports the WIT file and the F# project that references it. Run the component build with and without calling `HostWorld.exports.HostWorld.Foobar ()`; done means the configuration is identified and the link succeeds, or the limitation is documented.

Written by the indexing model from the issue text.

Assessment

Tech stack
csharp, fsharp, wasm
Domain
build-system
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.