wasmtime icon indicating copy to clipboard operation
wasmtime copied to clipboard

RFE: Expose module custom sections

Open FGasper opened this issue 3 years ago • 7 comments

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/customSections

^^ I may just be missing it, but I don't see an interface in wasmtime that corresponds to this one. Would it be possible to add this? (And also in the C API?)

Thank you!

FGasper avatar May 03 '21 15:05 FGasper

Sorry for the delay in responding here, but thanks for the report!

While wasmtime doesn't currently yet expose an API for this, you can pretty easily build one with the wasmparser crate:

use wasmparser::{Parser, Payload, Result};

fn custom_sections(bytes: &[u8]) -> impl Iterator<Item = Result<(&str, &[u8])>> {
    Parser::new(0).parse_all(bytes).filter_map(|payload| {
        let payload = match payload {
            Ok(s) => s,
            Err(e) => return Some(Err(e)),
        };
        match payload {
            Payload::CustomSection { name, data, .. } => Some(Ok((name, data))),
            _ => None,
        }
    })
}

Would that work for your purposes? Or is there a reason you need an API added to wasmtime itself?

alexcrichton avatar May 19 '21 14:05 alexcrichton

Is wasmparser available from C? I’m using this from Perl so would need something I can call from C.

Thank you!

FYI, there’s also discussion of adding such an interface to the standard C API: https://github.com/WebAssembly/wasm-c-api/issues/168#issuecomment-833713577

FGasper avatar May 20 '21 17:05 FGasper

There is not currently a C API for wasmparser, so if you don't want to write Rust code then this will need to wait until there's a C API binding for this in Wasmtime's C API.

alexcrichton avatar May 20 '21 20:05 alexcrichton

Sorry for the delay in responding here, but thanks for the report!

While wasmtime doesn't currently yet expose an API for this, you can pretty easily build one with the wasmparser crate:

use wasmparser::{Parser, Payload, Result};

fn custom_sections(bytes: &[u8]) -> impl Iterator<Item = Result<(&str, &[u8])>> {
    Parser::new(0).parse_all(bytes).filter_map(|payload| {
        let payload = match payload {
            Ok(s) => s,
            Err(e) => return Some(Err(e)),
        };
        match payload {
            Payload::CustomSection { name, data, .. } => Some(Ok((name, data))),
            _ => None,
        }
    })
}

Would that work for your purposes? Or is there a reason you need an API added to wasmtime itself?

Hi, this approach only accepts raw wasm input. Is it possible to get custom sections from a module which may be deserialized from compiled artifact?

ajihyf avatar Nov 11 '22 03:11 ajihyf

I don't think we preserve custom sections in precompiled modules.

bjorn3 avatar Nov 11 '22 09:11 bjorn3

I'm using dynamic linking to run multiple module instances with the same linear memory. The custom section naming "dylink.0" is required to provide proper imports to instantiate the modules. It seems that wasmer supports custom section query API like JavaScript, which works both in raw and compiled modules. Maybe wasmtime should preserve the custom sections, too?

ajihyf avatar Nov 14 '22 07:11 ajihyf

To confirm, precompiled artifacts don't store custom sections so this API would not be possible. I'd recommend extracting the custom section and saving it adjacent or next to wasmtime's compiled artifact.

alexcrichton avatar Nov 14 '22 15:11 alexcrichton

This is needed for Den now. For now I have to mask it with not implemented...pity

stevefan1999-personal avatar Sep 18 '23 15:09 stevefan1999-personal