Ld substitui magicamente símbolos estaticamente vinculados

or alguns dias, estamos lidando com um problema muito estranh

Não consigo entender como isso acontece - quando um programa de terceiros (MATLAB) usa nossa biblioteca compartilhada, de alguma forma, substitui alguns de nossos símbolos (impulso, para ser mais preciso) por ele próprio. Esses símbolos estão estaticamente vinculados e (!!) locais.

Aqui está o acordo - usamos o boost 1.47, o MATLAB aumentou o 1.40. Atualmente, a chamada de biblioteca segfaults em uma chamada da biblioteca OUR para o seu aumento (regex).

Então, aqui está a mágica:

Não temos dependências de biblioteca, 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)
Nenhum símbolo Cxx (nossos símbolos públicos são POC C para compatibilidade binária) são exportados de nossa biblioteca, nm:
nm -g --defined-only libmysharedlib.so

addr1 T OurCSymbol1
addr2 T OurCSymbol2
addr3 T OurCSymbol3
...
Ainda, ele usa o seu impulso. COMO? Stacktrace (caminhos cortados):
[  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

abe-se que o MATLAB dlopen apenas com o sinalizador RTLD_NO

Pessoas, pense comigo por favor. Agora, estou desesperado para não consertar isso, mas para simplesmente entender o comportamento de ld & el

edit: pequena pergunta adicional: como eu entendi, sem opções especiais de vinculação, símbolos nas bibliotecas linux .so nunca são vinculadas por endereço? Então, mesmo símbolos locais vinculados estaticamente são resolvidos em tempo de execução?

questionAnswers(2)

yourAnswerToTheQuestion