크로스 플랫폼 빌드 툴 tundra2를 사용하여 다양한 플랫폼에서 애플리케이션 바이너리를 빌드하기 시작했습니다. 그것은 아주 잘 작동합니다.C++ 11을 사용하여 구형 Linux 버전 용 바이너리를 빌드하려면 어떻게합니까?
그러나 우분투 10.04를 타겟팅해야합니다. 유감스럽게도 Ubuntu 10.04에 tundra2를 컴파일하는 것은 gcc 4.4에서 사용할 수없는 많은 C++ 11 기능을 사용하기 때문에 소스 코드를 크게 수정하지 않으면 불가능합니다. 더 새로운 gcc로 업그레이드 할 수 있지만 코드를 컴파일 할 수있는 것은 아닙니다.
그래서 나는 새로운 플랫폼에서 툰드라 2를 빌드하고 툰드라 2 바이너리를 10.04에 복사하려고 시도했다. 불행하게도 나는 이러한 오류를 얻을 :
(lucid_amd64)[email protected]:~/dev/OTOY2/extern/tundra2/build$ ./tundra2
./tundra2: /lib/libc.so.6: version `GLIBC_2.14' not found (required by ./tundra2)
./tundra2: /lib/libc.so.6: version `GLIBC_2.15' not found (required by ./tundra2)
내가 -static-된 libstdC++ 및 -static-관하여 libgcc 옵션 ++ 정적 연결 g을 시도했지만 오류가 지속.
질문이 제기됩니다. 새로운 컴파일러 기능으로 어떻게 이전 플랫폼을 목표로합니까? 우분투 10.04에서 GCC 4.8을 컴파일해야합니까?
gnu C 링커에 대해 더 읽고 배우고 싶으면 알 필요가 있다고 생각했습니다. 의존성을 유발하는 함수는 2.15에서 도입 된 __fdelt_chk라고하는 함수입니다. 범위 검사와 관련이 있습니다. 나는 그것을 끄거나 더미를 구현하려고 할 것입니다. 또한 memcpy는 Ubuntu 10.04에서 사용할 수없는 2.14를 원하고 있습니다.
편집. 2.14와 2.15에서 두 가지 공통적 인 변경 사항이있는 것으로 보입니다. 2.14에서는 memcpy가 내부적으로 memmove 호출로 업데이트되었음을 읽었습니다.2.15에서 메모리 경계 검사가 도입되었습니다 (이것이 __fdelt_chk에 관한 것입니다).
Appart에서 C++ 런타임이 정적으로 링크되어 있으면 10.04 및 Centos 5.5에서 이진 파일을 실행할 수 없습니다.
그래서 어떻게 처리할까요? 내가 memcpy 래퍼를 시도했지만 그게 어떤 이유로 작동하지 않았다. 여전히 2.14를 찾으려고 노력했습니다. 컴파일과 링크 라인의 끝에 -fno-stack-protector와 -U_FORTIFY_SOURCE를 넣어도 실제로 제거되지는 않았습니다. 또한 pthread와 같은 다른 라이브러리와도 연결되므로 필요할 지 모릅니다.
이 문제에 대한 해결책을 찾는 것이 실제로는 매우 일반적이며 일반적인 해결책이없는 것으로 보입니다. 나는 10.04에서 gcc 4.8을 컴파일하고 그 운임이 어떻게되는지보아야한다고 생각한다. 우분투 10.04 위에
[이전 libc로 컴파일 (GLIBC_2.14 '버전을 찾을 수 없음)] (https://stackoverflow.com/questions/10815453/compile-with-older-libc-version-glibc-2-14-not- found) –
아마 정적으로 컴파일 할 수 있다고 생각했습니다. 이진 파일이 50MB 대 200KB가 될지라도 상관 없습니다. – Matt
문자열의 출력에 따라 /lib/ld.so.6 | grep GLIB를 Ubuntu 10.04와 Ubuntu 13.10에 설치하면 GLIBC 2.11을 대상으로 할 수 있습니다. 2.11 glibc min을 허용하도록 컴파일러에 알릴 수 있습니까? – Matt