Steady Blog
Error : Uncaught (in promise) LinkError: import object field '__table_base' is not a Number 본문
Error : Uncaught (in promise) LinkError: import object field '__table_base' is not a Number
우유먹고쑥 2021. 2. 22. 15:33단일 모듈 테스트를 진행 중 발생한 Link Error
테스트 결과 이슈 해결
<해결전 EMCC 명령어>
<해결 후 EMCC 명령어>
- 원인 : 최적화 과정에서 __memory_base, __table_base 등에 대해 링크 오류 발생 일것으로 예상(부정확함)
> 최적화 과정이 어떻게 일어나는지에 대한 조사 및 정리 필요
> 관련 내용) [Issue#7467] Rename tableBase/memoryBase to __table_base/__memory_base
- 기존 tableBase/memoryBase이 __table_base/__memory_base로 수정됌(ver_1.37.0 이상 적용)
(명칭이 달라졌다고 하더라도, 이해가 안가는건 매한가지...)
- 테스트 차이 정리
: -O1을 –Os 로 수정
: -s WASM=1 추가
: -s SIDE_MODULE=2 을 -s SIDE_MODULE=1 로 수정
: EXPORTED_FUNCTIONS=[‘_Increment’]을 EXPORTED_FUNCTIONS=[‘Increment’]로 변경
- 옵션 정리
옵션명 |
내용 |
-O0 |
[컴파일 + 링크] 최적화 없음 (기본값) > 다양한 역설(Assertions)이 포함되어 있으므로 프로젝트 이식을 시작하는 데 권장되는 설정 > 최적화 설정 및 기타 최적화 설정은 컴파일 및 링크 중에 모두 의미가 있음 > 컴파일하는 동안 LLVM 최적화에 영향을 미치고 링크 중에 Binaryen에서 코드의 최종 최적화와 JS 최적화에 영향을 미침 |
-O1 |
[컴파일 + 링크] 간단한 최적화 > 컴파일 단계 동안 여기에는 LLVM –O1 최적화가 포함됩니다. 링크 단계 중에는 |
-O2 |
[컴파일 + 링크] -O1과 비슷하지만 더 많은 최적화가 가능 > 링크 중에 다양한 JavaScript 최적화를 가능하게 함 |
> JavaScript 최적화는 컴파일러가 사용하지 않는 것으로 간주하는 것을 제거하여 코드 크기를 줄일 수 있음 > 특히 모듈 개체에서 Export하지 않으면 런타임의 일부가 제거 될 수 있음 > 컴파일러는 –pre-js 및 –post-js의 코드를 인식하므로, -OS 옵션을 통해 런타임을 안전하게 사용할 수 있음 > -O2 대신, EXTRA_EXPORTED_RUNTIME_METHODS으로 사용 가능 |
|
-O3 |
[컴파일 + 링크] -O2와 비슷 > 실행 시간이 더 오래 걸릴 수 있는 추가 최적화가 있음 |
-Os |
[컴파일 + 링크] -O3와 비슷 > 코드 크기에 더 중점을 둔 최적화 옵션 (속도에 따라 상충 될 수 있음). (wasm과 JavaScrip 모두에 영향을 미칠 수 있음) |
-Oz |
[컴파일 + 링크] -Os와 비슷 > 코드 크기를 훨씬 더 줄이고 실행하는 데 더 오래 걸릴 수 있음 (wasm과 JavaScript 모두에 영향을 미칠 수 있음) |
-s WASM=1 |
wasm으로 결과물을 만드는 옵셩, 지정하지 않을 경우 EMscripten이 asm.js를 출력함 |
'임시 자료 > Emscripten&WASM' 카테고리의 다른 글
./emsdk: line 47: python3: Permission denied (0) | 2021.08.17 |
---|---|
emcc: error: The configured node executable (0) | 2021.02.20 |
[Emscripten/WASM] EMCC Compile 실행 시, C/Cpp Header가 없어도 컴파일 되는 이유 (0) | 2021.02.20 |