Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Экспорт new, delete, Как запретить при сборке библиотеки 
:(
    Опции темы
VladimirNi
Дата 23.11.2011, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.11.2011

Репутация: нет
Всего: нет



Здравствуйте!

Пишу разделяемую библиотеку для использования в качестве UDF.
Не проходит простой пример с таким фрагментом кода.

Код

  long* aTestItem = new long;
  delete aTestItem;


Библиотека работающая. Собирается без ошибок Если использовать ее не в UDF, а вызывать из простого тестового приложения, все проходит без ошибок. Без этих двух строк работает и как UDF.

В UDF на операторе delete возникает ошибка Segmentation fault.

Насколько понял в результате поиска, у Firebird свой менеджер памяти, а при сборке моей библиотеки new и delete автоматически экспортируются из библиотеки libstdc++. 

На форуме Firebird посоветовали указать линкеру не экспортировать из .so всё подряд.

Стал разбираться с параметрами компоновщика ld. Пробовал --no-export-dynamic,  --exclude-libs, никакого эффекта.
Ошибка та же самая. И таблица символов, выдаваемая по nm, остается без изменений.

Код

00000230 T TESTINSERT
         U _ZdlPv@@GLIBCXX_3.4
         U _Znwj@@GLIBCXX_3.4
00001330 A __bss_start
         U __gxx_personality_v0@@CXXABI_1.3
00001330 A _edata
00001330 A _end

Есть еще параметр --dynamic-list-cpp-new. Если его использвать, таблица символов также не меняется

Если кто-нибудь владеет этим вопросом, посоветуйте, пожалуйста, что можно сделать.

С уважением, Владимир.

------------------------------------------------
 
Ubuntu 10.04 LTS
g++ версии 4.4.3-4ubuntu5
libstdc++6
PM MAIL   Вверх
bsa
Дата 23.11.2011, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Попробуй использовать ключи компилятора и линкера -fvisibility=hidden -fvisibility-inlines-hidden, а так же линковать статически. Только имей в виду, что придется все экспортируемые функции/классы помечать специальным атрибутом.

Кстати, а может стоит использовать менеджер памяти Firebird?
PM   Вверх
VladimirNi
Дата 23.11.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 пока не смотрел.
Тестовая функция простая, но дальнейшая задача - запустить громоздкую библиотеку чужого кода.
Боюсь утонуть, если начну там что-то править.


С уважением, Владимир.
PM MAIL   Вверх
bsa
Дата 23.11.2011, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



VladimirNi, ну х.з. тогда. Можно еще попробовать сделать финт: делаешь простую библиотеку на С, которая загружает основную библиотеку и все вызовы перенаправляет в нее...
PM   Вверх
xvr
Дата 24.11.2011, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(VladimirNi @  23.11.2011,  00:08 Найти цитируемый пост)
Насколько понял в результате поиска, у Firebird свой менеджер памяти,

Если этот менеджер находится в какой то .so, то подайте эту .so при линковке своей UDF. new и delete будут взяты оттуда

PM MAIL   Вверх
VladimirNi
Дата 26.11.2011, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.11.2011

Репутация: нет
Всего: нет



Цитата

Если этот менеджер находится в какой то .so, то подайте эту .so при линковке своей UDF. new и delete будут взяты оттуда


В Firebird есть библиотека ib_util, в которой определена функция ib_util_malloc. Эту функцию можно использовать вместо malloc.
Но у меня в UDF не malloc, а оператор new. Что с ним делать - непонятно.

С уважением, Владимир.
PM MAIL   Вверх
xvr
Дата 26.11.2011, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(VladimirNi @  26.11.2011,  02:29 Найти цитируемый пост)
Что с ним делать - непонятно.

Написать свой new и delete

PM MAIL   Вверх
VladimirNi
Дата 28.11.2011, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.11.2011

Репутация: нет
Всего: нет



Цитата

Написать свой new и delete


Попробовал сделать это на простом примере. Получается следующее.

Вариант 1. Без new и delete.
Код

#include <stdlib.h>

long TESTINSERT(long *theArg)
{
  long* aTestItem = (long*) malloc(sizeof(long));
  free(aTestItem);

  long aResult = 777;
  return(aResult);
}

Такая UDF успешно отрабатывает.


Вариант 2. Ошибка с new и delete.
Код

long TESTINSERT(long *theArg)
{
  long* aTestItem = new long;
  delete aTestItem;

  long aResult = 778;
  return(aResult);
}

Ошибка Segmentation fault.


Вариант 3. Пытаюсь перегрузить операторы new и delete.
Код

#include <cstddef>
#include <stdlib.h>

void* operator new(size_t sz)
{
  void* m = malloc(sz);
  return m;
}

void operator delete(void* m)
{
  free(m);
}

long TESTINSERT(long *theArg)
{
  long* aTestItem = new long;
  delete aTestItem;

  long aResult = 779;
  return(aResult);
}

Ошибка Segmentation fault.


Если функция TESTINSERT вызывается не как UDF, а из обычной программы - все три варианта работают.

В чем может быть дело? 
Предполагалось, что после перегрузки new и delete вариант 3 сработает аналогично варианту 1.
Что еще можно попробовать?


С уважением, Владимир.
PM MAIL   Вверх
cupper
Дата 28.11.2011, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(VladimirNi @ 28.11.2011,  03:05)
Предполагалось, что после перегрузки new и delete вариант 3 сработает аналогично варианту 1.

А вы проверяли что в этом случае вызываются именно ваши перегруженные операторы ?
PM MAIL   Вверх
xvr
Дата 28.11.2011, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(VladimirNi @  28.11.2011,  03:05 Найти цитируемый пост)
Что еще можно попробовать?

Попробуйте ваши перегруженные new/delete описать как inline

PM MAIL   Вверх
VladimirNi
Дата 28.11.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.11.2011

Репутация: нет
Всего: нет



Цитата

А вы проверяли что в этом случае вызываются именно ваши перегруженные операторы ? 


Проверил.

При вызове из обычной программы отрабатывают перегруженные операторы. Все происходит, как предполагалось.

При вызове UDF перегруженные операторы игнорируются.
Оператор new (не перегруженный) проходит без ошибки.
На операторе delete UDF падает.

С уважением, Владимир. 

PM MAIL   Вверх
VladimirNi
Дата 28.11.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.11.2011

Репутация: нет
Всего: нет



Цитата

Попробуйте ваши перегруженные new/delete описать как inline


К сожалению, ничего не изменилось.

С уважением, Владимир. 

PM MAIL   Вверх
xvr
Дата 28.11.2011, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(VladimirNi @  28.11.2011,  14:42 Найти цитируемый пост)
К сожалению, ничего не изменилось.

Тогда как static. В общем, что бы из so не торчали ссылки на внешние new/delete

PM MAIL   Вверх
VladimirNi
Дата 29.11.2011, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.11.2011

Репутация: нет
Всего: нет



Ситуация разрешилась со стороны  Firebird.

Если подключаться не по локальному коннекту, а по сетевому, данная ошибка не проявляется.

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

Большое спасибо всем ответившим, наилучшие пожелания!

С уважением, Владимир. 
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0886 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.