Emscripten: 동적링크하기
개발일지/WebAssembly

Emscripten: 동적링크하기

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

아래 접속해서 확인

http://0.0.0.0:8080/main.html

 

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

아래 접속해서 확인

http://0.0.0.0:8080/main.html

참조

https://github.com/emscripten-core/emscripten/wiki/Linking

반응형

'개발일지 > WebAssembly' 카테고리의 다른 글

Emscripten: WebAssembly Install & example 테스트  (0) 2021.04.09