며칠 동안 우리는 매우 이상한 문제를 다루고 있습니다.Ld는 정적으로 링크 된 심볼을 마술처럼 오버라이드합니다.
제 3 자 (MATLAB) 프로그램이 우리의 공유 라이브러리를 사용할 때, 어떻게 든 우리의 기호 (부스트, 정확함)를 자신의 것으로 대체합니다. 그 기호는 정적으로 링크되어 있으며 (!!) 로컬입니다.
여기 거래가 있습니다. 우리는 부스트 1.47을 사용하고, MATLAB은 부스트 1.40을 사용합니다. 현재 라이브러리 호출은 seurfault를 호출하여 OUR 라이브러리에서 부스트 (regex)를 호출합니다.
그래서, 여기에 마법 : 우리는 더 라이브러리 의존성이 없다
- 는, LDD :
linux-vdso.so.1 => (0x00007fff4abff000) libpthread.so.0 => /lib/libpthread.so.0 (0x00007f1a3fd65000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f1a3fa51000) libm.so.6 => /lib/libm.so.6 (0x00007f1a3f7cd000) libgomp.so.1 => /usr/lib/libgomp.so.1 (0x00007f1a3f5bf000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f1a3f3a8000) libc.so.6 => /lib/libc.so.6 (0x00007f1a3f024000) /lib64/ld-linux-x86-64.so.2 (0x00007f1a414f9000) librt.so.1 => /lib/librt.so.1 (0x00007f1a3ee1c000)
- 없음 CXX 기호 (우리의 공공 상징 바이너리 호환성에 대한 POC C) Google 라이브러리에서 내보내집니다. nm :
- 여전히 부스트 기능을 사용합니다. 방법? 스택 트레이스 (경로가 절단) : MATLAB은 RTLD_NOW 플래그 만 함께한다면 dlopen 않습니다
[ 0] 0x00007f21fddbb0a9 bin/libmwfl.so+00454825 fl::sysdep::linux::unwind_stack(void const**, unsigned long, unsigned long, fl::diag::thread_context const&)+000009 [ 1] 0x00007f21fdd74111 bin/glnxa64/libmwfl.so+00164113 fl::diag::stacktrace_base::capture(fl::diag::thread_context const&, unsigned long)+000161 [ 2] 0x00007f21fdd7d42d bin/glnxa64/libmwfl.so+00201773 [ 3] 0x00007f21fdd7d6b4 bin/glnxa64/libmwfl.so+00202420 fl::diag::terminate_log(char const*, fl::diag::thread_context const&, bool)+000100 [ 4] 0x00007f21fce525a7 bin/glnxa64/libmwmcr.so+00365991 [ 5] 0x00007f21fb9eb8f0 lib/libpthread.so.0+00063728 [ 6] 0x00007f21f3e939a9 libboost_regex.so.1.40.0+00342441 boost::re_detail::perl_matcher, std::allocator > >, boost::regex_traits > >::match_all_states()+000073 [ 7] 0x00007f21f3eb6546 bin/glnxa64/libboost_regex.so.1.40.0+00484678 boost::re_detail::perl_matcher, std::allocator > >, boost::regex_traits > >::match_imp()+000758 [ 8] 0x00007f21c04ad595 lib/libmysharedlib.so+04855189 bool boost::regex_match, std::allocator > >, char, boost::regex_traits > >(__gnu_cxx::__normal_iterator, __gnu_cxx::__normal_iterator, boost::match_results, std::allocator > > >&, boost::basic_regex > > const&, boost::regex_constants::_match_flags)+000245 [ 9] 0x00007f21c04a71c7 lib/libmysharedlib.so+04829639 myfunc2()+000183 [ 10] 0x00007f21c01b41e3 lib/libmysharedlib.so+01737187 myfunc1()+000307
그것은 알려져있다.
사람들, 나와 함께 생각해주세요. 이제이 문제를 해결하지 않아도되지만 ld & elf 동작을 이해하는 것이 절실합니다.
편집 : 작은 추가 질문 : 특별한 링커 옵션이 없으면 리눅스의 .so 라이브러리에있는 기호가 주소별로 연결되지 않은 것입니다. 따라서 정적으로 링크 된 로컬 심볼조차도 런타임에서 해결됩니까?
솔루션처럼 보입니다. 확인해 보겠습니다.)) Thx. 즉각적인 질문 - -Bsymbolic과 함께 MATLAB 기호를 무시하고 "대칭"segfault가 발생할 가능성이 있습니까? 우리 도서관의 모든 부스트 기호는 정보로 '지역 약점'입니다. – ALOR
@ALOR'-Bsymbolic'은 링크 타임에 작업을 수행하고 "개체 내"참조가 해결되는 방식 만 변경합니다. 나는 이것을 명확히하기 위해 나의 대답 을 확장했다. – jkoshy
Matlab에서 실제로 필요로하는 것을 제외하고'libmysharedlib.so'에있는 모든 기호 (특히 모든 부스트 기호)를 완전히 숨기려면 링커 버전 스크립트를 사용하는 것도 고려해야합니다. 이렇게하면 프로그램의 런타임로드 속도가 빨라지고 나중에로드 된 다른 라이브러리에 라이브러리가 영향을 미치지 않도록 할 수 있습니다. –