나는 gcc 4.9를 사용하여 데비안에서 몇몇 대형 C++ 프로그램을 컴파일했습니다. 실행 가능한 바이너리 코드가 우분투에서 호환되고 안전한지 알고 싶습니다. 아니면 우분투에서 프로그램을 다시 컴파일해야 합니까?
답변1
문제는 현재 모든 Linux에서 널리 사용되는 핵심 라이브러리인 glibc에 있습니다. 여기에는 libc 공유 라이브러리에서 각 표준 함수의 여러 버전을 제공하는 기능을 추가하고 glibc와 함께 제공되는 라이브러리를 지원하는 "기호 버전 관리"라는 "기능"이 포함되어 있습니다.
예를 들어, 생성된 바이너리는 "GLIBC_2.15" 기호 버전에 따라 달라질 수 있지만 대상 시스템은 최대 "GLIBC_2.14"를 제공합니다. 그러면 치명적인 오류 메시지가 표시되며 그게 전부입니다.
일부 glibc 버전은 이전 커널이나 심지어 하드웨어에서도 실행을 거부하지만 이러한 경우는 드뭅니다.
glibc의 경우 정적 컴파일도 옵션이 아닙니다(생각해 본 경우). 일부 glibc 부분에는 정적 프로그램에서도 동적 라이브러리가 필요할 수 있기 때문입니다(컴파일 및 링크 중에 공간을 차지하면 경고 메시지가 표시됩니다).
여러 시스템에서 바이너리를 실행해야 한다면 다른 libc를 사용해야 합니다. 바이너리를 다른 시스템에서 실행하려면 해당 시스템에서 다시 빌드하는 것이 가장 좋습니다.
어떤 경우에는(glibc에는 해당되지 않음) 대상이 매우 느린 경우 컴파일된 소스 트리를 복사하고 모든 개체(*.o) 파일을 터치한 다음 바이너리를 제거할 수 있습니다. 그런 다음 실행하면 make
다시 연결됩니다.
또한 많은(전부는 아님!) 타사 라이브러리에서 기호 버전 관리 요구 사항을 적용할 수 있으며 이는 해당 라이브러리에도 적용됩니다.