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

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

02.02.2012, 12:44. Показов 7525. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru