Emscripten의 경우 기본적으로 Shared Library로 빌드되지 않고 Static Library로 변경되어 빌드되고 있다.
확인해보니 Emscripten 1.32.2 버전부터 Shared Library로 빌드할 수 있도록 지원하고 있어 이를 테스트해보고 기록한다.
일반적인 동적링크 테스트하기
main.c
#include <stdio.h>
int side(int a);
int main()
{
printf("hello world %d\\n", side(1));
}
side.c
int side(int a)
{
return a + 1;
}
pre.js
Module.dynamicLibraries = \['side.wasm'\];
위 3개 소스파일을 생성하고 컴파일 후 테스트하면 정상동작하는 것을 볼 수 있다.
아래 Command Line을 통해 컴파일 후 확인해보자.
EXPORT_ALL=1 옵션을 설정해줘야 한다. 특정한 함수만 export하고 싶다면 EXPORTED_FUNCTIONS를 설정해야 한다.
$ emcc -s SIDE_MODULE=1 -s EXPORT_ALL=1 -o side.wasm side.c
$ emcc -s MAIN_MODULE=1 --pre-js pre.js -o main.html main.c
$ python -m SimpleHTTPServer 8080
아래 접속해서 확인
dlopen 동적 링크 테스트
main.c
#include <dlfcn.h>
#include <stdio.h>
#include <emscripten.h>
int main()
{
int found = EM_ASM_INT(
return Module['preloadedWasm']['/side.so'] !== undefined;);
if (!found) {
return 1;
}
void _lib_handle = dlopen("/side.so", RTLD_NOW);
if (!lib_handle) {
return 2;
}
typedef int (_voidfunc)(int a);
voidfunc side = (voidfunc)dlsym(lib_handle, "side");
printf("hello world %d\n", side(1));
}
side.c
int side(int a)
{
return a + 1;
}
아래 Command Line을 통해 컴파일 후 확인해보자.
$ emcc -s SIDE_MODULE=1 -s EXPORT_ALL=1 -o side.wasm side.c
$ mv side.wasm side.so # 확장자는 의미없다. libhsp의 경우 unix 플랫폼일 때 기본적으로 .so로 로딩하기 때문에 확장자 이름을 .so로 변경한다.
$ emcc -s MAIN_MODULE=1 --preload-file .@/ --use-preload-plugins -o main.html main.c # --preload-file 옵션을 이용해 so를 preload 받을 수 있도록 한다.
$ python -m SimpleHTTPServer 8080
아래 접속해서 확인
참조
반응형
'개발일지 > WebAssembly' 카테고리의 다른 글
Emscripten: WebAssembly Install & example 테스트 (0) | 2021.04.09 |
---|