Steady Blog

Error : Uncaught (in promise) LinkError: import object field '__table_base' is not a Number 본문

임시 자료/Emscripten&WASM

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
(대문자O, 숫자0)

[컴파일 + 링크] 최적화 없음 (기본값)

> 다양한 역설(Assertions)이 포함되어 있으므로 프로젝트 이식을 시작하는 데 권장되는 설정

> 최적화 설정 및 기타 최적화 설정은 컴파일 및 링크 중에 모두 의미가 있음

> 컴파일하는 동안 LLVM 최적화에 영향을 미치고 링크 중에 Binaryen에서 코드의 최종 최적화와 JS 최적화에 영향을 미침
(빠른 증분 빌드의 경우 O0이 가장 좋지만 릴리스의 경우 더 높은 항목과 연결해야함)

-O1

[컴파일 + 링크] 간단한 최적화

> 컴파일 단계 동안 여기에는 LLVM O1 최적화가 포함됩니다. 링크 단계 중에는
O0이 수행하는 다양한 런타임 역설(Assertions)들이 JS에 포함되지 않습니다.

-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를 출력함