gcc 4.4.7이 포함된 CentOS 5.8은 libstdc++ 6.0.8에 연결됩니다. 어떻게 이럴 수있어?

gcc 4.4.7이 포함된 CentOS 5.8은 libstdc++ 6.0.8에 연결됩니다. 어떻게 이럴 수있어?

~에 따르면gcc ABI 정책, gcc 4.4.7은 libstdc++ 6.0.13에 의존해야 합니다. 제가 이해한 바에 따르면, 컴파일러 버전과 libstdc++ 버전은 밀접하게 연관되어 있으며 서로 호환되지 않습니다. 그래서 다음 사실을 알고 놀랐습니다.

  • CentOS 5.8은 어떻게든 기본 시스템(gcc-4.1.2 기반)과 함께 제공되는 6.0.8과 연결된 gcc44 패키지를 관리합니다.
  • 컴파일러 디렉토리(/usr/lib/gcc/x86_64-redhat-linux6E/4.4.7, 여기서 libstdc++-6.0.13을 찾을 것으로 예상됨)의 libstdc++.so는 어떤 종류의 공유 ​​객체에 대한 링크가 아닙니다. 텍스트 파일 포함INPUT ( -lstdc++_nonshared /usr/lib64/libstdc++.so.6 )

여기서 무슨 마법이 일어나고 있는 걸까요?

구체적으로:

  • 이전 버전의 libstdc++에 연결되는 gcc 4.4.7을 어떻게 제공합니까? 나는 이것이 불가능하다고 생각한다.
  • 이 stdc++_nonshared 라이브러리는 무엇입니까?
  • .so 파일에 해당 텍스트가 포함될 수 있다는 것을 몰랐습니다. 누가 그것을 분석하고(내 추측으로는 동적 링커), 그 사양과 결과는 무엇입니까?
  • 이 마법은 어디까지 갈 수 있나요? libstdc++ 6.0.3에서 gcc4.7을 사용할 수 있나요? 호환성 범위는 무엇입니까

답변1

이렇게 하면 rpm -q --requires gcc44다음이 표시됩니다.

libstdc++.so.6()(64bit)
libstdc++.so.6(CXXABI_1.3)(64bit)
libstdc++.so.6(GLIBCXX_3.4)(64bit)

따라서 rpm 자체에는 6.0.13에 대한 명시적인 버전 종속성이 없습니다.

찾은 대로 libstdc++.so.6은 libstdc++-4.1.2-53.el5에 속합니다.

이 버전 4.1.2는 RedHat에서 실질적인 의미가 없습니다. 새 버전의 백포트도 포함됩니다.

이거 봐요: rpm -q libstdc++ --changelog|more:

* Fri Mar 23 2012 Jakub Jelinek <[email protected]> 4.1.2-53.el5
- backport N2179 exception propagation support to improve
  gcc44 as well as Developer Toolset (#806275)

분명히 RedHat은 이 버전이 gcc44와 호환되도록 적극적으로 패치하고 있습니다.

관련 정보