повышение: asio и dlclose () — дамп ядра (незаконная инструкция)

#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