o seguinte código de ferrugem não consegue compilar usando o destino wasm32-unknown-emscripten
extern {
#[link(name="env")]
fn log_event(id: *const u8);
}
fn main() {
unsafe { log_event(::std::ptr::null()); }
}
com
error: unresolved symbol: log_event
corrija-me se eu estiver errado, posso estar terrivelmente errado com isso, mas #[link]
sem kind=static
implica link dinâmico e o código acima não deve falhar ao compilar?
Quanto ao emscripten em si, ele não tem nenhum problema em compilar o código C assim:
extern void log_event(void* ptr);
int main() {
log_event(0);
}
com emcc <source above.c> -O3 -s WASM=1 -s SIDE_MODULE=1 -o result.wasm
produzindo uma boa entrada de importação no result.wasm
(import "env" "_log_event" (func (;0;) (type 0)))
Portanto, a questão é: há alguma opção de ter símbolos dinâmicos no wasm resultante? Ou pelo menos substituir este argumento do vinculador ERROR_ON_UNDEFINED_SYMBOLS
em algum ponto?
o link de origem seria:
https://github.com/rust-lang/rust/blob/ec27aa97b921957711b96e578c7c197ff28553ac/src/librustc_back/target/wasm32_unknown_emscripten.rs#L21
@NikVolf, na verdade, você pode substituir os argumentos emcc com a ajuda da variável de ambiente EMMAKEN_CFLAGS
.
(presumindo que seu nome de arquivo seja main.rs
)
export EMMAKEN_CFLAGS="-s ERROR_ON_UNDEFINED_SYMBOLS=0"
rustc --target=wasm32-unknown-emscripten main.rs
Comentários muito úteis
@NikVolf, na verdade, você pode substituir os argumentos emcc com a ajuda da variável de ambiente
EMMAKEN_CFLAGS
.(presumindo que seu nome de arquivo seja
main.rs
)