boost: asio и dlclose () - дамп ядра (недопустимая инструкция) - PullRequest
0 голосов
/ 06 мая 2011

У меня есть application.so в Aix 5.3 и gcc 4.2.4.Application.so использует boost: asio.Есть example.c, который делает dlopen и dlclose для application.so.Однако при выходе из example.c я получаю дамп ядра.Обратите внимание, что все операции выполнены успешно.

Если я закомментирую код, связанный с boost, в application.so и по-прежнему буду ссылаться на boost_system.so при сборке application.so, я получу дамп ядра при выходе из example.c.Однако, если я не связываю boost_system.so при создании application.so, я не получаю дамп ядра при выходе из example.c.

Я пробовал boost_1_40, boost_1_42, boost_1_45 и gcc 4.2.0.Кто-нибудь видел эту проблему раньше.Если да, любая помощь будет принята с благодарностью.

{
hLib = dlopen(libPath, RTLD_LAZY | RTLD_GLOBAL);
fprintf(stderr, "Before dlclose");
dlclose(hLib);
}

Над сегментом, где проблема возникает.Как только выход из example.c завершается, я получаю дамп ядра.

EDIT

При сборке application.so с boost-system я получаю следующие предупреждения: -

ld: 0711-224 WARNING: Duplicate symbol: .non-virtual thunk to boost::exception_detail::error_info_injector<boost::system::system_error>::~error_info_injector

ld: 0711-224 WARNING: Duplicate symbol: .non-virtual thunk to boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >::~clone_impl()

ld: 0711-224 WARNING: Duplicate symbol: .non-virtual thunk to boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >::~clone_impl()

ld: 0711-224 WARNING: Duplicate symbol: .non-virtual thunk to boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >::clone() const

ld: 0711-224 WARNING: Duplicate symbol: .non-virtual thunk to boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >::rethrow() const

ld: 0711-224 WARNING: Duplicate symbol: .non-virtual thunk to boost::exception_detail::error_info_injector<boost::system::system_error>::~error_info_injector::system_error> >::~clone_impl()

ld: 0711-224 WARNING: Duplicate symbol: .non-virtual thunk to boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system:

ld: 0711-224 WARNING: Duplicate symbol: .non-virtual thunk to boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >::~clone_impl()

ld: 0711-224 WARNING: Duplicate symbol: .global destructors keyed to ras_arg_t

ld: 0711-224 WARNING: Duplicate symbol: .global constructors keyed to ras_arg_t

Я предполагаю, что эти дублирующие деструкторы не получаютвызывается во время dlclose, но во время выхода - когда библиотека выгружается.

1 Ответ

0 голосов
/ 08 марта 2012

Я не использую boost, но я использую AIX 5.3-5 и gcc 4.2.0, и испытал дамп ядра и

"ld: 0711-224 WARNING: Duplicate symbol: .global constructors keyed to ras_arg_t"

предупреждение о сцеплении.

Ответом на мою проблему было добавление слова typedef перед определением структуры ras_arg в /usr/include/sys/ras.h

Это похоже на случай thread_credentials, описанный здесь: http://www.ibm.com/developerworks/forums/thread.jspa?threadID=119546

...