#boost #boost-asio #aix #coredump
#повышение #повышение-asio #aix #coredump
Вопрос:
У меня есть приложение.то же самое в Aix 5.3 и gcc 4.2.4. Application.поэтому используется boost: asio. Есть example.c, который выполняет dlopen и dlclose для application.so . Однако, когда example.c завершается — я получаю дамп ядра. Пожалуйста, обратите внимание, что все операции выполнены успешно.
Если я закомментирую связанный с повышением код в приложении.итак, и все еще ссылка 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 завершает работу, я получаю дамп ядра.
Редактировать
При сборке приложения.итак, с 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, а во время exit — к этому времени библиотека выгружается.
Комментарии:
1. Я не видел такого поведения в Linux. Можете ли вы опубликовать какой-нибудь пример кода, который воспроизводит проблему?
2. @Sam. Нет, я вижу это в AIX, а не в Linux. Я опубликовал изолированный блок, который вызывает проблему.
3. Можете ли вы опубликовать минимальный пример кода,
application.so
показывающий проблему?
Ответ №1:
Я не использую 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