IT한 것/Mobile (iOS, AOS)

ndk r16으로 빌드중 toolchain crash

lovian 2021. 3. 17. 09:47

* What went wrong:
Execution failed for task ':app:externalNativeBuildRelease'.
> Build command failed.
Error while executing process /home/lovian/android/cmake/3.6.4111459/bin/cmake with arguments {--build /home/lovian/work/Rosemary/build/android/app/.externalNativeBuild/cmake/release/armeabi --target native-lib}
[1/3] Building C object SGAll/base/CMakeFiles/SGBase.dir/src/SGBaseWrapper.c.o
FAILED: /opt/ndk/android-ndk-r16b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv5te-none-linux-androideabi --gcc-toolchain=/opt/ndk/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 --sysroot=/opt/ndk/android-ndk-r16b/sysroot -I/opt/ndk/android-ndk-r16b/sysroot/usr/include/arm-linux-androideabi -I../../../../../../../base/include -I../../../../../../../base/src -I../../../../../../../base/src/iconv -isystem /opt/ndk/android-ndk-r16b/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=14 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -fvisibility=hidden -fvisibility=hidden -Os -DNDEBUG -MD -MT SGAll/base/CMakeFiles/SGBase.dir/src/SGBaseWrapper.c.o -MF SGAll/base/CMakeFiles/SGBase.dir/src/SGBaseWrapper.c.o.d -o SGAll/base/CMakeFiles/SGBase.dir/src/SGBaseWrapper.c.o -c /home/lovian/work/Rosemary/base/src/SGBaseWrapper.c
clang: error: unable to execute command: Segmentation fault (core dumped)
clang: error: clang frontend command failed due to signal (use -v to see invocation)
Android clang version 5.0.300080 (based on LLVM 5.0.300080)
Target: armv5te-none-linux-android
Thread model: posix
InstalledDir: /opt/ndk/android-ndk-r16b/toolchains/llvm/prebuilt/linux-x86_64/bin
clang: note: diagnostic msg: PLEASE submit a bug report to http://llvm.org/bugs/ and include the crash backtrace, preprocessed source, and associated run script.
clang: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /tmp/SGBaseWrapper-5a0aae.c
clang: note: diagnostic msg: /tmp/SGBaseWrapper-5a0aae.sh
clang: note: diagnostic msg:

********************
ninja: build stopped: subcommand failed.

이렇게 특정 파일을 컴파일 하다가 clang이 죽는다.

십수년간 개발하면서 처음보는 컴파일러 사망.

그리고 찾아본 backtrace

(gdb) bt
#0 0x0000000000f1ded3 in ?? ()
#1 0x0000000000f1d5a3 in ?? ()
#2 0x0000000000f17cfa in ?? ()
#3 0x0000000000f113b5 in ?? ()
#4 0x00000000029cf6ce in ?? ()
#5 0x00000000010f27c2 in llvm::FPPassManager::runOnFunction(llvm::Function&) ()
#6 0x000000000304b6c3 in llvm::FPPassManager::runOnModule(llvm::Module&) ()
#7 0x000000000304bad1 in llvm::legacy::PassManagerImpl::run(llvm::Module&) ()
#8 0x000000000156bd15 in clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*, clang::BackendAction, std::__1::unique_ptr<llvm::raw_pwrite_stream, std::__1::default_delete<llvm::raw_pwrite_stream> >) ()
#9 0x00000000016cd04b in clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) ()
#10 0x000000000178036f in clang::ParseAST(clang::Sema&, bool, bool) ()
#11 0x00000000016c97f3 in clang::CodeGenAction::ExecuteAction() ()
#12 0x00000000011b1535 in clang::FrontendAction::Execute() ()
#13 0x000000000116b20f in clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) ()
#14 0x000000000112736a in clang::ExecuteCompilerInvocation(clang::CompilerInstance*) ()
#15 0x000000000111c686 in cc1_main(llvm::ArrayRef<char const*>, char const*, void*) ()
#16 0x0000000001125c0e in main ()

간단하게 상황을 파악해본 결과..
이 컴파일러의 구조체 관련 처리시에 사용하는 메모리의 한계치가 존재 하는 것 같다.

그 근거로 이 소스는 매크로 덩어리로 이루어진 함수 포인터를 잔뜩(대략 300개) 가지는 구조체를 가지고 있는데, 이 구조체에 대해서 실제 함수를 매핑시켜주는 작업을 한다.
이 매핑작업 코드를 제거하면 빌드가 정상임을 확인한 터라, 영향 있는 범위를 찾아보니 마지막 부분임을 확인했다.

이 후반 부분 매핑을 어떤것을 하거나 구조체에서 순서를 바꿔도 동일한 문제가 발생하는 것을 확인했다.

 

이상태면 구조체를 분리해야하는데 어쩐다..

 

결국 카테고리별로 함수 포인터를 구조체로 나누어 문제를 우회했다.