문제 상황
- 빌드한 크로스 컴파일 바이너리를 실행할 때, _jmpbuf_sp, __pointer_chk_guard_local 같은 심볼 관련 에러가 발생하였다.
- 이는 sysroot 내의 라이브러리들(예: glibc, libpthread 등)의 심볼릭 링크가 절대 경로로 되어 있어, 경로 변경 후 링크가 깨지거나 호스트 경로가 혼입되어 발생하는 문제였다.
해결 과정
- sysroot 완전 동기화
- 라즈베리파이에서 sysroot에 필요한 디렉토리들(예: /usr/include, /usr/lib, /lib, /lib/aarch64-linux-gnu 등)을 rsync로 호스트 PC의 sysroot(예: rpi-sysroot)에 복사
- 툴체인 및 CMake 설정 점검
- CMAKE_SYSROOT, CMAKE_FIND_ROOT_PATH_MODE_LIBRARY, RPATH 등 크로스 컴파일 환경이 sysroot 내부의 라이브러리를 우선 참조하도록 설정되어 있는지 확인
- sysroot 심볼릭 링크 문제 확인
- 빌드 과정 중 _jmpbuf_sp, __pointer_chk_guard_local 등의 심볼 에러가 발생하는 것을 보며, sysroot 내의 심볼릭 링크가 절대 경로로 되어 있어 문제가 될 가능성 의심
- sysroot-relativelinks.py 스크립트 실행
- 호스트 PC에서 python3 sysroot-relativelinks.py rpi-sysroot 명령어를 실행하여, sysroot 내의 절대 심볼릭 링크들을 대상 sysroot 경로에 맞게 상대 링크로 변환
- 클린 빌드 및 재실행
- 빌드 디렉토리를 클린하고 재빌드를 진행한 후, 바이너리를 라즈베리파이에서 실행하니 오류가 사라졌다.
요약 및 향후 조치 방법
- 원인:
sysroot 내 심볼릭 링크가 절대 경로로 설정되어 경로 변경 시 깨지거나, host와 타겟 간 라이브러리 경로가 혼재되어 발생하는 문제. - 해결책:
- 라즈베리파이의 sysroot(예: /usr/include, /usr/lib, /lib, /lib/aarch64-linux-gnu 등) 전체를 호스트로 동기화합니다.
- CMake 및 툴체인 설정이 sysroot 내부 파일만 참조하도록 적절하게 설정되어 있는지 확인합니다.
- 경로를 변경한 후에는 sysroot-relativelinks.py 스크립트를 다시 실행하여 sysroot 내의 절대 링크를 상대 링크로 변환합니다.
- 클린 빌드 후 대상 시스템(라즈베리파이)에서 테스트 실행합니다.
이 과정을 기억해두면, 다음 번에 비슷한 링크나 심볼 관련 에러가 발생했을 때 sysroot 심볼릭 링크 문제로 의심하고 바로 sysroot-relativelinks.py를 실행해 해결할 수 있습니다.