본문 바로가기

소프트웨어 & 잡다

GCC 4.1 호환 지원

GCC 4.4.6 로(정확히는 GCC4.1 보다 높은 버젼으로) 라이브러리를 빌드하면, GCC 4.1 이하 버젼에서 사용할 수가 없다. 다음과 유사한 링크 에러가 발생하기 때문이다.


/root/3rdPartyDependencies/lib/libcryptopp.a(gf2n.o): In function `operator<< <std::char_traits<char> >':

/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/../../../../include/c++/4.4.4/ostream:458: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)'

/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/../../../../include/c++/4.4.4/ostream:458: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)'

/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/../../../../include/c++/4.4.4/ostream:458: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)'

/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/../../../../include/c++/4.4.4/ostream:458: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)'

/root/3rdPartyDependencies/lib/libcryptopp.a(gf2n.o): In function `operator<< <std::char_traits<char> >':

/opt/jenkins/workspace/ABR/cryptopp/commit/target/checkout/stage/gf2n.cpp:481: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)'

/root/3rdPartyDependencies/lib/libcryptopp.a(integer.o):/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/../../../../include/c++/4.4.4/ostream:458: more undefined references to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' follow

./lib/libabreapi.so: undefined reference to `typeinfo for __cxxabiv1::__forced_unwind'

./lib/libabreapi.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<unsigned long>(unsigned long)'

collect2: ld returned 1 exit status


미국지사에 보낸 라이브러리가 동일한 문제로 링크가 안된다고 연락이와서 급하게 조사를 해보니, GCC 4.1.6을 사용하고 있었다. 우리쪽 빌드 시스템은 전체적으로 4.4.6을 사용하고 있었기에, 미처 확인하지 못하였던 부분이 발견된 것이다.


여러가지 대책을 찾다보니, 이는 잘 알려진 문제로써 다음 포럼에 자세한 이유와 해결책이 설명 되어 있었다.


http://glandium.org/blog/?p=1901


하지만 위의 내용 이외에도 __cxxabiv1::__forced_unwind 심볼을 찾을수 없는 문제가 발견 되었고, forced_unwind 의 virtual destructor를 추가해야 된다는 내용이 있었다.


결론적으로, 다음 소스를 추가함으로써 위의 GCC 하위 호환 문제를 간단히 해결할 수 있었다.


http://devdoc.madlib.net/v0.7/libstdcxx-compatibility_8cpp_source.html


라이브러리 배포시 문제가 발생한 분들은 참고하시길.