Nous avons un programme qui doit fonctionner sur des plates-formes Windows, Debian et UBuntu. Tout se passe bien sous Windows... Sur les plateformes Linux, le programme plantent à l'éxécution d'un chargement dynamique d'un librairie SO (Les traces sont légèrement différentes, nous ne préseterons que celle de Debian pour alléger la discussion) Nous avons les traces suivantes:
#0 0x0000000000025936 in ?? ()
#1 0x00007f54172760fc in std::bad_alloc::bad_alloc (this=0x7fffcfebc9a8) at /usr/include/c++/4.6/new:59
#2 0x00007f5413fee83a in boost::exception_detail::bad_alloc_::bad_alloc_ (this=0x7fffcfebc980) at /DHS/c/boost_1_48_0/boost/exception/detail/exception_ptr.hpp:100
#3 0x00007f5413fee99e in boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_alloc_> () at /DHS/c/boost_1_48_0/boost/exception/detail/exception_ptr.hpp:119
#4 0x00007f5413fe97d6 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /DHS/c/boost_1_48_0/boost/exception/detail/exception_ptr.hpp:138
#5 0x00007f5413fe9852 in _GLOBAL__sub_I_Chroma.cpp(void) () at libex/trunk/src/Definition/Chroma.cpp:213
#6 0x00007f541dc00cd0 in ?? () from /lib64/ld-linux-x86-64.so.2
#7 0x00007f541dc00dc7 in ?? () from /lib64/ld-linux-x86-64.so.2
#8 0x00007f541dc05183 in ?? () from /lib64/ld-linux-x86-64.so.2
#9 0x00007f541dc00926 in ?? () from /lib64/ld-linux-x86-64.so.2
#10 0x00007f541dc0489a in ?? () from /lib64/ld-linux-x86-64.so.2
#11 0x00007f541d283f66 in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
#12 0x00007f541dc00926 in ?? () from /lib64/ld-linux-x86-64.so.2
#13 0x00007f541d2842ec in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
#14 0x00007f541d283ee1 in dlopen () from /lib/x86_64-linux-gnu/libdl.so.2
La ligne 213 est un } qui représente la dernière ligne d'une fonction et du fichier (sur UBuntu, c'est la même chose mais sur un autre fichier). Visiblement, cette fonction n'a jamais été appelé (Il y aurait eu des traces de l'appelant). Le fichier n'a pas de référence direct à BOOST, bien que dans les *.h et d'autres composants de notre librairie BOOST est utilisé. Le code fait aussi usage important de singleton qui amènent l'usage variables statiques globales.
De plus, les programmes de tests chargeant la même librairie fonctionne (mais il n'y a pas le chargement dynamique après le démarrage)
Il semble que tout soit lié à l'initialiation lors du chargment dynamique, mais nous n'avons pas vu d'options dans gcc ou le loader qui nous permettrait de controler el chargement. Nous ne comprennons pas aussi le lien avec BOOST.
Est-ce qu'il y a quelqu'un qui a un hint pour nous sortir de ce mauvais pas?
Partager