ProgrammingLang/c++

[C++] gcc 버전을 업그레이드 후 프로그램 배포시 유의사항

jinkwon.kim 2024. 8. 26. 11:48
728x90
반응형

개요

gcc 버전을 업데이트한후 프로그램 배포시 gcc에서 생성한 library 몇개는 꼭 가져야 합니다. 

이렇게 하지 않으면 segment fault가 발생 합니다. 

문제 발생 상황

Ubuntu 18.04에서 GCC 13.1로 업그레이드한 후, 빌드된 실행 파일이 호스트 시스템의 설치된 libstdc++와 호환되지 않는 이유는 다음과 같은 원인에서 발생할 수 있습니다:

원인

  1. ABI (Application Binary Interface) 차이:
    • GCC는 특정 버전에서 ABI에 변경을 가할 수 있습니다. 이는 C++ 표준 라이브러리(libstdc++)의 내부 구현이 변경되어 이전 버전의 GCC로 컴파일된 바이너리와 호환되지 않게 될 수 있다는 것을 의미합니다. 특히, 새로운 기능이나 최적화가 도입될 때 이러한 변경이 발생할 수 있습니다.
  2. libstdc++ 버전 차이:
    • GCC 13.1은 최신 C++ 표준의 새로운 기능을 지원하며, 이로 인해 libstdc++의 새로운 버전이 필요합니다. Ubuntu 18.04에 기본적으로 설치된 libstdc++는 GCC 7.x 또는 8.x에 맞춰져 있을 가능성이 큽니다. 이 버전은 GCC 13.1에서 요구하는 최신 C++ 표준 기능을 제공하지 않기 때문에 호환성 문제가 발생할 수 있습니다.
  3. 심볼릭 링크 및 라이브러리 경로 문제:
    • 시스템의 기본 libstdc++.so가 GCC 13.1의 새 라이브러리와 충돌할 수 있습니다. 실행 파일이 빌드될 때는 GCC 13.1의 라이브러리를 사용하지만, 실행 시에는 시스템의 기본 라이브러리를 참조하여 충돌이 발생할 수 있습니다.

 

필수로 가져가야 할 라이브러리

  1. libstdc++.so (C++ 표준 라이브러리):
    • 최신 GCC로 빌드된 C++ 프로그램은 해당 버전의 libstdc++.so를 필요로 합니다. 이 라이브러리는 C++ 표준 라이브러리로, std::vector, std::string과 같은 표준 C++ 기능을 제공합니다.
    • 위치: /usr/local/gcc-13.1.0/lib64/libstdc++.so
  2. libgcc_s.so (GCC 런타임 라이브러리):
    • GCC가 사용하는 런타임 라이브러리입니다. 이 라이브러리는 예외 처리와 같은 기능을 제공합니다.
    • 위치: /usr/local/gcc-13.1.0/lib64/libgcc_s.so
  3. libgomp.so (GCC OpenMP 라이브러리, OpenMP를 사용하는 경우):
    • OpenMP를 사용하는 프로그램의 경우 필요합니다.
    • 위치: /usr/local/gcc-13.1.0/lib64/libgomp.so
  4. libatomic.so (원자 연산을 사용하는 경우):
    • 원자 연산(atomic operation)을 사용하는 경우 필요합니다.
    • 위치: /usr/local/gcc-13.1.0/lib64/libatomic.so
  5. libssp.so (스택 보호를 사용하는 경우):
    • 스택 보호(Stack smashing protection)를 사용하는 경우 필요합니다.
    • 위치: /usr/local/gcc-13.1.0/lib64/libssp.so
  6. libquadmath.so (고정밀 수학 연산을 사용하는 경우):
    • 고정밀 수학 연산을 사용하는 경우 필요합니다.
    • 위치: /usr/local/gcc-13.1.0/lib64/libquadmath.so
728x90
반응형