【问题标题】:Shared memory ('sys/shm.h') with emscripten与 emscripten 共享内存 ('sys/shm.h')
【发布时间】:2020-02-18 16:36:44
【问题描述】:

我一直在探索 emscripten,尝试编译一些使用 'sys/shm.h' 的基本 wasm 示例

这是我要编译的代码:

#include <stdio.h>
#include <sys/shm.h> 

int main(int argc, char *argv[]) {
    key_t key = ftok("shmfile",65); 
    int shmid = shmget(key,1024,0666|IPC_CREAT); 

    char *str = (char*) shmat(shmid,(void*)0,0); 
    sprintf(str, "balhhh");

    printf("Data in memory: %s\n",str); 

    shmdt(str); 
    return 0; 
}

这是我的编译输出:

➜  wasm emcc --version
emcc (Emscripten gcc/clang-like replacement) 1.39.8 (commit 1458145cf4f3db0fb548343e6acab267eef8e4ef)
Copyright (C) 2014 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


➜  wasm emcc -o shared.html shared.c -s WASM=1 -s USE_PTHREADS=1                        
error: undefined symbol: ftok
warning: Link with `-s LLD_REPORT_UNDEFINED` to get more information on undefined symbols
warning: To disable errors for undefined symbols use `-s ERROR_ON_UNDEFINED_SYMBOLS=0`
error: undefined symbol: shmat
error: undefined symbol: shmdt
error: undefined symbol: shmget
Error: Aborting compilation due to previous errors
shared:ERROR: '/home/wave/Downloads/emsdk/node/12.9.1_64bit/bin/node /home/wave/Downloads/emsdk/upstream/emscripten/src/compiler.js /tmp/tmpiWE3Ei.txt' failed (1)


➜  wasm emcc -o shared.html shared.c -s WASM=1 -s USE_PTHREADS=1 -s LLD_REPORT_UNDEFINED
wasm-ld: error: /tmp/emscripten_temp_bNjvle/shared_0.o: undefined symbol: ftok
wasm-ld: error: /tmp/emscripten_temp_bNjvle/shared_0.o: undefined symbol: shmget
wasm-ld: error: /tmp/emscripten_temp_bNjvle/shared_0.o: undefined symbol: shmat
wasm-ld: error: /tmp/emscripten_temp_bNjvle/shared_0.o: undefined symbol: shmdt
wasm-ld: error: /home/wave/.emscripten_cache/wasm-obj/libc-mt.a(emscripten_pthread.c.o): undefined symbol: initPthreadsJS
shared:ERROR: '/home/wave/Downloads/emsdk/upstream/bin/wasm-ld -o /tmp/emscripten_temp_bNjvle/shared.wasm --lto-O0 /tmp/emscripten_temp_bNjvle/shared_0.o -L/home/wave/Downloads/emsdk/upstream/emscripten/system/local/lib -L/home/wave/Downloads/emsdk/upstream/emscripten/system/lib -L/home/wave/.emscripten_cache/wasm-obj /home/wave/.emscripten_cache/wasm-obj/libc-mt.a /home/wave/.emscripten_cache/wasm-obj/libcompiler_rt.a /home/wave/.emscripten_cache/wasm-obj/libc-wasm.a /home/wave/.emscripten_cache/wasm-obj/libdlmalloc-mt.a /home/wave/.emscripten_cache/wasm-obj/libpthread-mt.a /home/wave/.emscripten_cache/wasm-obj/libc_rt_wasm.a /home/wave/.emscripten_cache/wasm-obj/libsockets-mt.a --allow-undefined-file=/tmp/tmp5_bZ9l.undefined --import-memory --import-table --shared-memory -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --strip-debug --export __wasm_call_ctors --export __data_end --export main --export __errno_location --export emscripten_get_global_libc --export __pthread_tsd_run_dtors --export __emscripten_pthread_data_constructor -z stack-size=5242880 --initial-memory=16777216 --no-entry --max-memory=16777216 --global-base=1024' failed (1)

我猜想在 emscripten 中有共享内存支持,但我就是无法让 wasm-ld 正确链接它。 有人可以帮忙吗?

谢谢, 加尔

【问题讨论】:

  • 为什么你认为 Emscripten 支持共享内存?显然,WebAssembly 代码不允许使用共享内存。我猜 Emscripten 可能拥有实际上并未共享的“假”共享内存,但为什么会这样呢?
  • 当在 WebAssembly 中实现多内存时,可以精细控制共享内存。目前只能共享所有内存。

标签: c llvm webassembly emscripten emcc


【解决方案1】:

Emscripten 不支持 SysV 共享内存(sys/shm.h 中的函数)。

【讨论】:

  • 今天不是这样。 Emscripten 现在支持 Pthread。
  • @tigercosmos 是否也支持 SysV 共享内存?
  • 对不起!我误解了这两件事。
猜你喜欢
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 2021-12-04
  • 2016-06-22
  • 2021-05-26
  • 2012-12-11
  • 2021-09-24
  • 2012-07-29
相关资源
最近更新 更多