2014-01-24 3 views
4

크로스 플랫폼 빌드 툴 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 위에

+0

[이전 libc로 컴파일 (GLIBC_2.14 '버전을 찾을 수 없음)] (https://stackoverflow.com/questions/10815453/compile-with-older-libc-version-glibc-2-14-not- found) –

+0

아마 정적으로 컴파일 할 수 있다고 생각했습니다. 이진 파일이 50MB 대 200KB가 될지라도 상관 없습니다. – Matt

+0

문자열의 출력에 따라 /lib/ld.so.6 | grep GLIB를 Ubuntu 10.04와 Ubuntu 13.10에 설치하면 GLIBC 2.11을 대상으로 할 수 있습니다. 2.11 glibc min을 허용하도록 컴파일러에 알릴 수 있습니까? – Matt

답변

1

컴파일 tundra2 소스 코드

소스에서 GCC의 최신의 그리고 최고의 릴리스를 설치 상당한 재 작업없이 할 수 없습니다.

+0

예, 동료가 10.04에 gcc를 컴파일하기 위해 제안한 것입니다. 그런 다음 소스 트리에 바이너리를 확인하면 해당 플랫폼에만 설치할 수 있습니다. – Matt

+0

glibc의 최신 버전을 사용하는 시스템에서 생성 된 바이너리를 사용할 수 있습니다. –

+0

이것이 가장 쉬운 접근 방법이었습니다. 솔직히 gcc를 컴파일하는 것은 어려운 과정이었습니다. 내 virtualbox VM에서 너무 오래 걸렸기 때문에 부분적으로. 내가 기반으로 한 프로세스는 저에게 맞았습니다. http://blog.scalebit.com/2011/04/compiling-gcc-46-in-ubuntu-1010-for-c11.html – Matt

관련 문제