![]() |
|
Модераторы: xvr |
![]()
|
|
| VladimirNi |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.11.2011 Репутация: нет Всего: нет |
Здравствуйте!
Пишу разделяемую библиотеку для использования в качестве UDF. Не проходит простой пример с таким фрагментом кода.
Библиотека работающая. Собирается без ошибок Если использовать ее не в UDF, а вызывать из простого тестового приложения, все проходит без ошибок. Без этих двух строк работает и как UDF. В UDF на операторе delete возникает ошибка Segmentation fault. Насколько понял в результате поиска, у Firebird свой менеджер памяти, а при сборке моей библиотеки new и delete автоматически экспортируются из библиотеки libstdc++. На форуме Firebird посоветовали указать линкеру не экспортировать из .so всё подряд. Стал разбираться с параметрами компоновщика ld. Пробовал --no-export-dynamic, --exclude-libs, никакого эффекта. Ошибка та же самая. И таблица символов, выдаваемая по nm, остается без изменений.
Есть еще параметр --dynamic-list-cpp-new. Если его использвать, таблица символов также не меняется Если кто-нибудь владеет этим вопросом, посоветуйте, пожалуйста, что можно сделать. С уважением, Владимир. ------------------------------------------------ Ubuntu 10.04 LTS g++ версии 4.4.3-4ubuntu5 libstdc++6 |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Попробуй использовать ключи компилятора и линкера -fvisibility=hidden -fvisibility-inlines-hidden, а так же линковать статически. Только имей в виду, что придется все экспортируемые функции/классы помечать специальным атрибутом.
Кстати, а может стоит использовать менеджер памяти Firebird? |
|||
|
||||
| VladimirNi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.11.2011 Репутация: нет Всего: нет |
Спасибо за совет, пробую!
Задал ключи -fvisibility=hidden -fvisibility-inlines-hidden. В результате в таблице символов тип для моей функции TESTINSERT изменился с T на t, вызываться она перестала. __attribute__((visibility("default"))) вернул все на место. Но при всем этом U _ZdlPv@@GLIBCXX_3.4 U _Znwj@@GLIBCXX_3.4 из таблицы символов не уходят. Чтобы линковать статически, достаточно задать ключ -static, или требуется что-нибудь еще? Пробовал, но компоновщик не находит библиотеку libgcc_s. Действительно, на диске имеется только so версия этой библиотеки. Насчет использования менеджера памяти Firebird пока не смотрел. Тестовая функция простая, но дальнейшая задача - запустить громоздкую библиотеку чужого кода. Боюсь утонуть, если начну там что-то править. С уважением, Владимир. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
VladimirNi, ну х.з. тогда. Можно еще попробовать сделать финт: делаешь простую библиотеку на С, которая загружает основную библиотеку и все вызовы перенаправляет в нее...
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
||||
|
||||
| VladimirNi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.11.2011 Репутация: нет Всего: нет |
В Firebird есть библиотека ib_util, в которой определена функция ib_util_malloc. Эту функцию можно использовать вместо malloc. Но у меня в UDF не malloc, а оператор new. Что с ним делать - непонятно. С уважением, Владимир. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
||||
|
||||
| VladimirNi |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.11.2011 Репутация: нет Всего: нет |
Попробовал сделать это на простом примере. Получается следующее. Вариант 1. Без new и delete.
Такая UDF успешно отрабатывает. Вариант 2. Ошибка с new и delete.
Ошибка Segmentation fault. Вариант 3. Пытаюсь перегрузить операторы new и delete.
Ошибка Segmentation fault. Если функция TESTINSERT вызывается не как UDF, а из обычной программы - все три варианта работают. В чем может быть дело? Предполагалось, что после перегрузки new и delete вариант 3 сработает аналогично варианту 1. Что еще можно попробовать? С уважением, Владимир. |
||||||||
|
|||||||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
А вы проверяли что в этом случае вызываются именно ваши перегруженные операторы ? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
||||
|
||||
| VladimirNi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.11.2011 Репутация: нет Всего: нет |
Проверил. При вызове из обычной программы отрабатывают перегруженные операторы. Все происходит, как предполагалось. При вызове UDF перегруженные операторы игнорируются. Оператор new (не перегруженный) проходит без ошибки. На операторе delete UDF падает. С уважением, Владимир. |
|||
|
||||
| VladimirNi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.11.2011 Репутация: нет Всего: нет |
К сожалению, ничего не изменилось. С уважением, Владимир. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
||||
|
||||
| VladimirNi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.11.2011 Репутация: нет Всего: нет |
Ситуация разрешилась со стороны Firebird.
Если подключаться не по локальному коннекту, а по сетевому, данная ошибка не проявляется. Кроме того, для локального соединения разработчики планируют внести исправления. Большое спасибо всем ответившим, наилучшие пожелания! С уважением, Владимир. |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |