Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14

Создание динамической библиотеки для СУБД Oracle

02.02.2012, 12:44. Показов 7646. Ответов 27
Метки нет (Все метки)

Добрый день.
У Субд Оракл есть технология подключения сторонних программ (например на с или с++).
Подключаются они к базе в виде динамических библиотек (*.so).
Эта технология работает отлично до тех пор , пока подключаемая библиотека использует другие стандартные же библиотеки (которые находятся в /usr/lib или /usr/local/lib).
Но вдруг если в программе есть #include файлы совершенно с другой дериктории, а сами библиотеки находятся в другой, то в самой базе (после подключения данной библиотеки) возникают проблемы при обращении к функциям, определенным в этих include файлах и библиотеках.

Суть:
1) программа :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#ifdef _WIN32
#   include <windows.h>
#   include <wincrypt.h>
#else
#   include <string.h>
#   include <stdlib.h>
#   include <CSP_WinDef.h>
#   include <CSP_WinCrypt.h>
#endif
#include <WinCryptEx.h>
 
 
int Mysign(char *source)
{
 HCRYPTPROV   hCRYPTPROV  =  0;
 const BYTE * Pin = (BYTE*) "csp1";
 
 // initialize
 if (!CryptAcquireContext(&hCRYPTPROV,"promtraktor", NULL, PROV_GOST_2001_DH,CRYPT_SILENT))
 {
   // error 1
   return 1;
 }
 if (!CryptSetProvParam(hCRYPTPROV,PP_KEYEXCHANGE_PIN,Pin,NULL))
 {
   // error 2
   return 2;
 }
 // deinitialize
 if (hCRYPTPROV)
 {
   CryptReleaseContext(hCRYPTPROV, 0);
 }
 // success
 return 0;
}
2) make file писал не я (поэтому трудно разобраться):

.SUFFIXES: .cpp
#CC=gcc

#CCC=g++

CPCCC=$(CCC)$(CXX)
# For FreeBSD you should add -pthread to LDFLAGS.
CFLAGS=-DUNIX -DHAVE_LIMITS_H $(ARCH_FLAGS) $(add_CPPFLAGS) -I$(CSP_INCLUDE) -I$(CSP_INCLUDE)/cpcsp -I$(CSP_INCLUDE)/asn1c/rtsrc -I$(CSP_INCLUDE)/asn1data -DSIZEOF_VOID_P=$(SIZEOF_VOID_P) -g
LDFLAGS= $(ARCH_FLAGS) -L $(CSP_LIB) -lasn1data -lssp -lcapi10 -lcapi20 $(CSP_EXTRA_LIBS) $(add_ldflags) -g

OBJS=$(out).o
$(out): $(OBJS)
$(CPCCC) $(OBJS) $(LDFLAGS) -o $@ $(add_libs)
clean:
for i in $(out) $(OBJS) ; do test -r "$${i}" || continue ; rm "$${i}" ; done
.cpp.o:
$(CPCCC) $(CFLAGS) -c -fPIC -o $@ $<


Как я понял, сначала с помощью gcc и директивы include файлов (-I) это все компилится и создается объектный файл (*.о).
Потом с помощью g++ и директивы подклчаемых библиотек (-L) создается исполняемый файл.Здесь ,я думаю, большую роль играет add_libs...(но для программы , которая описана выше - здесь будет ошибка так как не хватает main - поэтому я довольствуюсь только объектным файлом, полученным в результате работы gcc).

Но для СУБД мне нужна библиотека (*.so). Поэтому я решил взять данный make файл за основу. Впоследствии я сделал так :
gcc -shared -o *.so *.o,
получил баблиотеку и закинул в базу...
Но, увы, fail... (при выполении вылетает ошибка что функции не определены)
Позже, посмотрев содержимое объектного файла и файла библиотеки (коанда nm) , обнаружил вот это :


U CryptAcquireContextА
U CryptReleaseContext
U CryptSetProvParam
U _GLOBAL_OFFSET_TABLE_
0000000000000000 T Mysign


u - значит данные контекст не определен. Думаю, поэтому ошибка. Пробовал во время создания объектного файла явно указать подключаемые библиотки через (-L), но неудачано...
Что делать? Помогите, пожалуйста, кто знает как решить эту проблему...

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

Заранее спасибо, всем кто откликнулся...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.02.2012, 12:44
Ответы с готовыми решениями:

Создание динамической библиотеки
есть makefile root_include_dir :=include root_source_dir:=src source_subdirs :=./cRand ./fft ./rs compile_flags :=-Wall -pipe ...

Сборка динамической библиотеки
Пытаюсь собрать динамическую библиотеку для использования её из питона. #include &lt;iostream&gt; #include &lt;string&gt; ...

Не видит содержимое динамической библиотеки
(clang, linux) Делаю так: 1. Компиляция объектов 2. Сборка в динамическу библиотеку 3. Расположение её в /usr/local/lib (чтобы не...

27
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
02.02.2012, 16:08  [ТС]
Цитата Сообщение от KuKu Посмотреть сообщение
А могут быть проблемы с правами того, от кого запускается оракл ?
Могут, это завист от того как будет настроен так называемый Listener у Оракла.
Я все делал под админом. Другие (более простенькие программы) - работают отлично.
Все же я думаю что тут с объектным файлом что-то нето...
Там перед названиями функций символ "U" стоит - значит объект не определен.
Но это тока в объектном файле ! Когда формируется выполняемый файл - там уже подключаются все библиотеки и все эти функции инициализируются.
Вопрос как тоже самое сделать для динамической библиотеки...
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
02.02.2012, 16:25
fluence, расскажи, как ты пытаешься использовать получившуюся .so ?

Добавлено через 2 минуты
Цитата Сообщение от fluence Посмотреть сообщение
перед названиями функций символ "U" стоит - значит объект не определен.
потому что используется динамическая линковка. и при просмотре импорта+экспорта получившейся .so, библиотека libcapi10 недоступна.

намек понятен?

Добавлено через 1 минуту
еще покажи вывод:
> echo $PATH
0
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
02.02.2012, 16:44  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
fluence, расскажи, как ты пытаешься использовать получившуюся .so ?

Добавлено через 2 минуты

потому что используется динамическая линковка. и при просмотре импорта+экспорта получившейся .so, библиотека libcapi10 недоступна.

намек понятен?

Добавлено через 1 минуту
еще покажи вывод:
> echo $PATH
Я у ораклистов спрашивал на форуме

http://www.sql.ru/forum/actual... tid=911435

Кому интересно - можете почитать - там не много написано

Способ использования прост :
данная библиотека копируется в папку оракла, потом выполняются следующие действия:

1) Cсылка на файл
Oracle 11 SQL
1
2
CREATE OR REPLACE LIBRARY MY_SIGN_LIB
AS '/orcl/u01/app/oracle/product/9.2.0/lib/Mysign.so'
2) Создание функции (с указателем на ссылку)
Oracle 11 SQL
1
2
3
4
5
6
7
CREATE OR REPLACE FUNCTION UFJ_SIGN (source IN VARCHAR2) 
RETURN    BINARY_INTEGER
AS
 language C
 LIBRARY MY_SIGN_LIB
 name "Mysign"
 parameters (source STRING,RETURN INT);
3) Использование функции в
Oracle 11 SQL
1
2
3
4
5
6
DECLARE 
  i BINARY_INTEGER;
BEGIN
  i:=UFJ_SIGN('asd');
  DBMS_OUTPUT.put_line(i);
END;
--------------
[root@localhost Mysign]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin :/home/redhat/bin
[root@localhost Mysign]#
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
02.02.2012, 17:01
Цитата Сообщение от fluence Посмотреть сообщение
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin :/home/redhat/bin
а где же путь к каталогу в котором лежат используемые .so файлы?
0
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
02.02.2012, 17:03  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
а где же путь к каталогу в котором лежат используемые .so файлы?
А как ее добавить? Или все со -шки скопировать в /usr/local/lib (/usr/local/bin)?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
02.02.2012, 17:23
в домашнем каталоге есть .profile (имя начинается с точки).
найди в нем строку "export PATH ..." или "PATH= ...", и покажи ее.

Добавлено через 16 секунд
или обе, если есть.
1
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
02.02.2012, 23:10
тебе надо добавить путь до твоих "нестандартных" либ в переменную LD_LIBRARY_PATH

что-то типа
Bash
1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/directory/with/my/nonstandard/libraries
1
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
03.02.2012, 11:09  [ТС]
ОЛОЛО.....

Последовал совету и установил LD_LIBRARY_PATH.
Что из этого вышло:

Если файл называется Mysign.cpp , то объектный файл Mysign.so создается с помощью g++ , а при использовании на стороне клиента вылетает undefined __gxx_personality , но предыдущей ошибки уже нету!

Если же файл имеет расширение Mysign.c , то объектный файл Mysign.so создается с помощью gсс , а при использовании вылетает то, с чего я начал данную тему.


Вобщем, Happy End - меня скоро уволят....

Кстати когда я компилил даже Mysign.c - исполняемый файл то работал ! Ему пофиг было с или срр...

Добавлено через 34 минуты
Цитата Сообщение от fluence Посмотреть сообщение
ОЛОЛО.....

Последовал совету и установил LD_LIBRARY_PATH.
Что из этого вышло:

Если файл называется Mysign.cpp , то объектный файл Mysign.so создается с помощью g++ , а при использовании на стороне клиента вылетает undefined __gxx_personality , но предыдущей ошибки уже нету!

Если же файл имеет расширение Mysign.c , то объектный файл Mysign.so создается с помощью gсс , а при использовании вылетает то, с чего я начал данную тему.


Вобщем, Happy End - меня скоро уволят....

Кстати когда я компилил даже Mysign.c - исполняемый файл то работал ! Ему пофиг было с или срр...

Даже когда файл - Mysign.cpp : я делаю
g++ -shared -o Mysign.so Mysign.o
выходит ошибка, которая в самом начале темы (не определен CryptAquireContextA)

Добавлено через 4 минуты
Делал

[root@chtest01 lib]# export LD_LIBRARY_PATH=/opt/cprocsp/lib/amd64
[root@chtest01 lib]# echo $LD_LIBRARY_PATH
/opt/cprocsp/lib/amd64
[root@chtest01 lib]#

Добавлено через 18 минут
Ура я сделал !

Если выбераеш .с то при создании библиотеки нужно делать так ,

gcc -shared -o Mysign.so Mysign.o -L/opt/cprocsp/lib/amd64 -lcapi10 -lcapi20

Если .срр , то

g++ -shared -o Mysign.so Mysign.o -L/opt/cprocsp/lib/amd64 -lcapi10 -lcapi20, только нужно явно указать _cdecl

Добавлено через 28 минут
Огромное спасибо всем, кто пытался помочь!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.02.2012, 11:09

Ошибка преобразования при сборке динамической библиотеки
При сборке программы с динамической библиотекой позднего связывания вылазит ошибка: Пробовал как-нибудь преобразовать к одному типу, но не...

Создание динамической библиотеки для GUI
Доброй ночи, дорогие форумчане! Пишу Вам впервые, работаю с QT всего-ничего, так что не серчайте. Итак, есть некий проект, в котором...

Создание библиотеки для Oracle, которая будет передавать запрос в БД MySQL
Привет Всем!! Друзья подскажите пожалуйста. Передо мной стоит задача создать библиотеку для Oracle, которая будет передавать запрос в БД...

Вызов функции одной динамической библиотеки из другой динамической библиотеки
Добрый день! Помогите пожалуйста разобраться со следующим вопросом. Возможно ли из одной библиотеки передать параметры для...

Создание динамической библиотеки сортировок
Всем привет, дали задание создать динамическую библиотеку с сортировками bubble и Quick. Я делаю в компиляторе dev с++ dllmain.c ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru