피드로 돌아가기
Dev.toFrontend
원문 읽기
Emscripten LTO 활성화 시 EM_JS 심볼 미정의 문제 해결
The Two Things That Bit Me In Emscripten
AI 요약
Context
React, TypeScript, C++ 기반 WebAssembly 애플리케이션 구축 중 Emscripten의 Link-Time Optimization(-flto) 옵션 적용 시 발생하는 링커 오류 분석. 서로 다른 Translation Unit 간 EM_JS 매크로 함수 호출 시 발생하는 Undefined Symbol 문제와 JS 외부 노출 시의 심볼 참조 실패가 병목 지점으로 작용.
Technical Solution
- EM_JS 매크로 호출부를 extern "C" 블록으로 감싸 C Linkage를 명시함으로써 LTO 최적화 과정에서의 심볼 소실 방지
- 동일 Translation Unit 내 Wrapper 함수를 설계하여 JS 인터페이스 함수에 대한 간접 참조 구조 구현
- EM_JS 정의부를 헤더 파일에 배치하여 선언과 정의를 일치시키는 구조적 정렬 수행
- EMSCRIPTEN_KEEPALIVE 속성 또는 visibility("default") 속성을 부여하여 링커의 Dead-code Elimination 대상에서 제외
- Release 빌드의 최적화 플래그가 심볼 가시성에 미치는 영향을 검증하기 위한 조기 빌드 테스트 프로세스 도입
실천 포인트
- Emscripten LTO 사용 시 EM_JS 함수를 extern "C"로 래핑했는지 확인 - JS에서 호출해야 하는 C 함수에 EMSCRIPTEN_KEEPALIVE 적용 여부 검토 - Debug 빌드와 Release 빌드의 심볼 동작 차이를 조기에 검증하는 파이프라인 구축