|
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
|
||||||
Создание динамической библиотеки для СУБД Oracle02.02.2012, 12:44. Показов 7548. Ответов 27
Метки нет (Все метки)
Добрый день.
У Субд Оракл есть технология подключения сторонних программ (например на с или с++). Подключаются они к базе в виде динамических библиотек (*.so). Эта технология работает отлично до тех пор , пока подключаемая библиотека использует другие стандартные же библиотеки (которые находятся в /usr/lib или /usr/local/lib). Но вдруг если в программе есть #include файлы совершенно с другой дериктории, а сами библиотеки находятся в другой, то в самой базе (после подключения данной библиотеки) возникают проблемы при обращении к функциям, определенным в этих include файлах и библиотеках. Суть: 1) программа :
.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
|
||||||
| 02.02.2012, 12:44 | |
|
Ответы с готовыми решениями:
27
Создание динамической библиотеки
Не видит содержимое динамической библиотеки |
|
|
|||
| 02.02.2012, 13:21 | |||
|
Добавлено через 9 минут что-то не понимаю... функции CryptAcquireContext(), CryptSetProvParam(), CryptReleaseContext() - это WINAPI функции. как это ты пытаешься в лине собирать? Up. или их альтернативная реализация находится в:
дай ссылку на реализацию.
0
|
|||
|
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
|
|
| 02.02.2012, 13:21 [ТС] | |
|
Скрин в PL/SQL Developere
0
|
|
|
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
|
||
| 02.02.2012, 13:26 [ТС] | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
|
|||
| 02.02.2012, 13:37 [ТС] | |||
|
http://www.cryptopro.ru/faq/ka... pod-yuniks - необходимый пакеты для этого Добавлено через 4 минуты
0
|
|||
|
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
|
|
| 02.02.2012, 13:42 [ТС] | |
|
0
|
|
|
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
|
|||
| 02.02.2012, 14:02 | |||
|
0
|
|||
|
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
|
|
| 02.02.2012, 14:26 | |
|
мб статик сборка?
0
|
|
|
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
|
|
| 02.02.2012, 14:51 [ТС] | |
|
Собственно, установленные пакеты :
[redhat@localhost ~]$ cd /opt/cprocsp [redhat@localhost cprocsp]$ ls bin include lib sbin share src [redhat@localhost cprocsp]$ В папке lib - все библиотеки криптоправайдера, папка include - инклуд файлы, src - там исходные cpp файлы 1) Содержимое include папок capilite и cpcsp (они основные) : [redhat@localhost cprocsp]$ cd include [redhat@localhost include]$ ls asn1c capiextern.h common.h cppkcs11 fkc_version.h pkix reader asn1data capilite cpcsp Crypt.h interfaces pkixcmp [redhat@localhost include]$ ls capilite ASN1Blob.h ASN1Traits.h ASN1Util.h CPCrypt.h EncodeAnd.h ASN1Exceptions.h ASN1Types.h ChainUtil.h Date.h StoreUtil.h [redhat@localhost include]$ ls cpcsp callctx.h cryptmem.h CSP_Sspi.h KeyPairOpers.h stdafx.h CheckHash.h CSPHandles.h cspvtable.h lfmm.h WinCryptEx.h cmpmem.h CSPKernel.h CSP_WinBase.h platformstream.h wincspc.h constant.h csp_lic.h CSP_WinCrypt.h serial_def.h wincsp.h cpasn.h cspmm.h CSP_WinDef.h serial.h wincspx.h CpSChl.h csp_rc.h CSP_WinError.h simple_hash.h winrmcsp.h CpSSP.h CSP_SChannel.h dbtrace_initer.h SSPMap.h [redhat@localhost include]$ Теперь об исходном файле для моей библиотеки: Находится он [redhat@localhost Mysign]$ cd /opt/cprocsp/src/doxygen/CSP/Mysign [redhat@localhost Mysign]$ ls Makefile.unix Makefile.unix~ Mysign.c~ Mysign.cpp Mysign.o Mysign.so [redhat@localhost Mysign]$ Компиляция осуществляется путем: cd /opt/cprocsp/src/doxygen/CSP eval `../setenv.sh --64`; make -f Makefile.unix clean eval `../setenv.sh --64`; make -f Makefile.unix Содержимое файла setenv.sh : #!/bin/sh ARG=32 #case `isainfo -k` in #i386|sparc) ARG=32;; #amd64|sparcv9) ARG=64;; #esac case `uname -m` in x86_64|amd64) ARG=64;; esac for i in $* do case $i in --64) ARG=64;; --32) ARG=32;; --help|--usage) echo "Usage: setenv.sh options" >&2 echo "--32 - configure 32bit environbent" >&2 echo "--64 - configure 64bit environment" >&2 exit 1;; esac done if test x$ARG = x64 then libdir=/opt/cprocsp/lib/amd64 SIZEOF_VOID_P=8 else libdir=/opt/cprocsp/lib/ia32 SIZEOF_VOID_P=4 fi add_CPPFLAGS= test -f /usr/include/stdint.h && \ add_CPPFLAGS="${add_CPPFLAGS} -DHAVE_STDINT_H" test -f /usr/include/sys/inttypes.h && \ add_CPPFLAGS="${add_CPPFLAGS} -DHAVE_SYS_INTTYPES_H" if test -z "$CXX" && test -z "$CCC";then echo "No compiler specified... trying to guess" >&2 case `uname -s` in # SunOS) case `isainfo -k` in SunOS) case "XXX" in #for stupid lsb checkers "XXX" (instead of isainfo -k) amd64) COMPARCH=amd64 test $ARG = 64 && CSP_KERNEL_FLAGS="-DUSE_STD_MM -xmodel=kernel";; sparcv9) COMPARCH=v9 CSP_KERNEL_FLAGS="-DUSE_STD_MM";; esac if test -f /opt/SUNWspro/bin/CC;then echo "Studio is found">&2 CCC=/opt/SUNWspro/bin/CC elif type CC >/dev/null;then echo "CC is in the path" >&2 CCC=CC elif type g++ >/dev/null;then echo "g++ is found">&2 CCC=g++ else echo "No C++ found">&2 exit 1 fi test x$ARG = x64 && case $CCC in *CC) case `$CCC -V 2>&1|head -1|cut -d' ' -f4` in 5.9) echo "ARCH_FLAGS=\"-m64\";export ARCH_FLAGS;";; *) echo "ARCH_FLAGS=\"-xarch=$COMPARCH\";export ARCH_FLAGS;";; esac test -n "$CSP_KERNEL_FLAGS" && echo "CSP_KERNEL_FLAGS=\"$CSP_KERNEL_FLAGS\"; export CSP_KERNEL_FLAGS;" ;; *) CCC="$CCC -m64";; esac echo "CCC=\"$CCC\";export CCC;" if test -f /opt/SUNWspro/bin/cc;then echo "Studio is found">&2 CC=/opt/SUNWspro/bin/cc elif type cc >/dev/null;then echo "cc is in the path" >&2 CC=cc elif type gcc >/dev/null;then echo "gcc is found">&2 CC=gcc else echo "Nothing is found">&2 exit 1 fi echo "CC=\"$CC\";export CC;" ;; AIX) if test x$ARG = x32;then echo "CCC=/usr/vacpp/bin/xlC;export CCC;" echo "CC=\"/usr/vac/bin/cc -qlanglvl=extc89 -qlanglvl=extc99\";export CC;" else echo "CCC=\"/usr/vacpp/bin/xlC -q64\";export CCC;" echo "CC=\"/usr/vac/bin/cc -q64 -qlanglvl=extc89 -qlanglvl=extc99\";export CC;" echo "OBJECT_MODE=64;export OBJECT_MODE;" fi ;; *) if type g++ >/dev/null;then echo "g++ found in the path" >&2 if test `uname -m` = x86_64 && test x$ARG = x32 then echo "CC=\"gcc -m32\";export CC;" echo "CXX=\"g++ -m32\";export CXX;" echo "ARCH_FLAGS=\"-m32\";export ARCH_FLAGS;" else echo "CC=\"gcc\";export CC;" echo "CXX=\"g++\";export CXX;" fi if test x$ARG = x32 then echo "LSB_LD=/lib/ld-lsb.so.3;export LSB_LD;" else echo "LSB_LD=/lib64/ld-lsb-x86-64.so.3;export LSB_LD;" fi else echo "Nothing is found">&2 exit 1 fi;; esac fi if test -z "$INSTALL" then if type install >/dev/null;then INSTALL=install else INSTALL=cp fi fi echo "CSP_DIR=/opt/cprocsp;" echo "CSP_INCLUDE=/opt/cprocsp/include;" echo "add_CPPFLAGS=\"$add_CPPFLAGS\";" echo "SIZEOF_VOID_P=$SIZEOF_VOID_P;" echo "CSP_LIB=$libdir;" echo "INSTALL=$INSTALL;" case `uname -s` in SunOS)echo "CSP_EXTRA_LIBS=\"-R$libdir -lsocket -lnsl\";";; FreeBSD)echo "CSP_EXTRA_LIBS=\"-R$libdir -lpthread\";";; AIX)echo "CXXFLAGS=\"$CXXFLAGS -qlang=stdc99\";export CXXFLAGS" echo "add_ldflags=\"-Wl,-brtl\";";; *) echo "CSP_EXTRA_LIBS=\"-lpthread\";";; esac echo "export CSP_DIR CSP_INCLUDE CSP_LIB CSP_EXTRA_LIBS SIZEOF_VOID_P INSTALL add_ldflags add_CPPFLAGS;" 2) Содержимое файла Makefile.unix DIRS= Mysign all: for d in $(DIRS); do ( cd $$d; $(MAKE) -f Makefile.unix ) || fail=yes; done;\ test -z "$$fail" clean: for d in $(DIRS); do ( cd $$d; $(MAKE) -f Makefile.unix clean) done Третий этап компиляции я уже указал в самом начале... Я знаю - это тупо, я пробовал все библиотеки и инклуд файлы запихать в /usr/local Но в таком случае программа не компилируеется. Добавлено через 9 минут На мой запрос Криптоправайдер сказал, что нужно при создании объектного файла подключать библиотеки. Это что-то похожее вида gcc -shared -fPIC -o Mycrypt.so Mycrypt.o -L/opt/cprocsp/lib -lcapi10 -lcapi20 ???
0
|
|
|
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
|
|
| 02.02.2012, 14:54 | |
|
А у вас без посредничества оракла все работает ?
0
|
|
|
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
|
|
| 02.02.2012, 14:56 [ТС] | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
|
||
| 02.02.2012, 15:01 [ТС] | ||
|
[redhat@localhost lib]$ cd /opt/cprocsp/lib/amd64 [redhat@localhost amd64]$ ls libasn1data.so libcpui.so.3.6.1 librdrrdr.so.3 libasn1data.so.3 libcsp.so librdrrdr.so.3.6.1 libasn1data.so.3.6.1 libcsp.so.3 librdrrndmbio_tui.so libcapi10.so libcsp.so.3.6.1 librdrrndmbio_tui.so.3 libcapi10.so.3 libpkixcmp.so librdrrndmbio_tui.so.3.6.1 libcapi10.so.3.6.1 libpkixcmp.so.3 librdrrndm.so libcapi20.so libpkixcmp.so.3.6.1 librdrrndm.so.3 libcapi20.so.3 librdrdsrf.so librdrrndm.so.3.6.1 libcapi20.so.3.6.1 librdrdsrf.so.3 librdrsup.so libcpext.so librdrdsrf.so.3.6.1 librdrsup.so.3 libcpext.so.3 librdrfat12.so librdrsup.so.3.6.1 libcpext.so.3.6.1 librdrfat12.so.3 libssp.so libcpui.so librdrfat12.so.3.6.1 libssp.so.3 libcpui.so.3 librdrrdr.so libssp.so.3.6.1
0
|
||
|
|
|
| 02.02.2012, 15:07 | |
|
теперь сделай поиск по динамическим библиотекам на предмет экспорта той функции, которая на скрине.
как найдешь, добавь ее в список библиотек при собрке .so >gcc -shared -fPIC -o Mycrypt.so Mycrypt.cpp -L/opt/cprocsp/lib -lcapi10 -lcapi20 -l??? потом покажи экспорт+импорт получившейся .so Добавлено через 56 секунд и покажи декларацию той функции что на скрине.
0
|
|
|
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
|
|||
| 02.02.2012, 15:39 [ТС] | |||
|
[root@localhost lib]# ls amd64 hashes ia32 [root@localhost lib]# cd amd64 [root@localhost amd64]# ls libasn1data.so libcpui.so.3.6.1 librdrrdr.so.3 libasn1data.so.3 libcsp.so librdrrdr.so.3.6.1 libasn1data.so.3.6.1 libcsp.so.3 librdrrndmbio_tui.so libcapi10.so libcsp.so.3.6.1 librdrrndmbio_tui.so.3 libcapi10.so.3 libpkixcmp.so librdrrndmbio_tui.so.3.6.1 libcapi10.so.3.6.1 libpkixcmp.so.3 librdrrndm.so libcapi20.so libpkixcmp.so.3.6.1 librdrrndm.so.3 libcapi20.so.3 librdrdsrf.so librdrrndm.so.3.6.1 libcapi20.so.3.6.1 librdrdsrf.so.3 librdrsup.so libcpext.so librdrdsrf.so.3.6.1 librdrsup.so.3 libcpext.so.3 librdrfat12.so librdrsup.so.3.6.1 libcpext.so.3.6.1 librdrfat12.so.3 libssp.so libcpui.so librdrfat12.so.3.6.1 libssp.so.3 libcpui.so.3 librdrrdr.so libssp.so.3.6.1 [root@localhost amd64]# nm libcapi10*3.6.1 0000000000003700 T CryptAcquireContextA 0000000000003a80 T CryptAcquireContextW 0000000000005820 T CryptContextAddRef 0000000000004d00 T CryptCreateHash 0000000000004bd0 T CryptDecrypt 0000000000003e30 T CryptDeriveKey 0000000000005070 T CryptDestroyHash 0000000000003f80 T CryptDestroyKey 00000000000056c0 T CryptDuplicateHash 0000000000005560 T CryptDuplicateKey 0000000000004aa0 T CryptEncrypt 0000000000006670 T CryptEnumOIDInfo 000000000000c0f0 T CryptEnumProvidersA 00000000000069e0 T CryptEnumProviderTypesA 0000000000004800 T CryptExportKey 0000000000006710 T CryptFindOIDInfo 0000000000006ee0 T CryptFreeOIDFunctionAddress 0000000000003cf0 T CryptGenKey 0000000000004610 T CryptGenRandom 0000000000005900 T CryptGetDefaultProvider 0000000000004340 T CryptGetHashParam 0000000000004150 T CryptGetKeyParam 0000000000006f50 T CryptGetOIDFunctionAddress 00000000000035d0 T CryptGetProviderDll 0000000000004510 T CryptGetProvParam 00000000000046c0 T CryptGetUserKey 0000000000004e60 T CryptHashData 0000000000004f60 T CryptHashSessionKey 0000000000004930 T CryptImportKey 0000000000007dd0 T CryptInitOIDFunctionSet 0000000000005be0 T CryptRegisterOIDInfo 0000000000003c10 T CryptReleaseContext 0000000000004250 T CryptSetHashParam 0000000000004060 T CryptSetKeyParam 0000000000005a60 T CryptSetProviderEx 0000000000004440 T CryptSetProvParam 0000000000005260 T CryptSignHashA 0000000000005150 T CryptSignHashW 0000000000005470 T CryptVerifySignatureA 0000000000005340 T CryptVerifySignatureW 0000000000006860 T FormatMessage 000000000000c680 T GetLastError 000000000000c670 T SetLastError [root@localhost amd64]# Она уже подключена -lcapi10 Добавлено через 3 минуты [root@localhost Mysign]# gcc -shared -fPIC -o Mysign.so Mysign.cpp -L/opt/cprocsp/lib/amd64 -lcapi10 -lcapi20 -I/opt/cprocsp/include -I/opt/cprocsp/include/cpcsp -I/opt/cprocsp/include/asn1c/rtsrc -I/opt/cprocsp/include/asn1data In file included from Mysign.cpp:11: /opt/cprocsp/include/cpcsp/WinCryptEx.h:32:22: wincrypt.h: No such file or directory In file included from Mysign.cpp:11: /opt/cprocsp/include/cpcsp/WinCryptEx.h:1520: error: `__cdecl' does not name a type /opt/cprocsp/include/cpcsp/WinCryptEx.h:1578: error: `__cdecl' does not name a type /opt/cprocsp/include/cpcsp/WinCryptEx.h:1686: error: ISO C++ forbids declaration of `CPC_Kernel_Fpu_Begin_Callback' with no type /opt/cprocsp/include/cpcsp/WinCryptEx.h:1686: error: expected `;' before '*' token /opt/cprocsp/include/cpcsp/WinCryptEx.h:1694: error: ISO C++ forbids declaration of `CPC_Kernel_Fpu_End_Callback' with no type /opt/cprocsp/include/cpcsp/WinCryptEx.h:1694: error: expected `;' before '*' token Mysign.cpp: In function `int Mysign(char*)': Mysign.cpp:25: warning: passing NULL used for non-pointer converting 4 of `BOOL CryptSetProvParam(HCRYPTPROV, DWORD, const BYTE*, DWORD)' [root@localhost Mysign]# Подключал библиотеки и инклуд дериктории так же как и в make файле...
0
|
|||
|
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
|
|
| 02.02.2012, 15:52 | |
|
А могут быть проблемы с правами того, от кого запускается оракл ?
0
|
|
| 02.02.2012, 15:52 | |
|
Помогаю со студенческими работами здесь
20
Создание динамической библиотеки для GUI Создание библиотеки для Oracle, которая будет передавать запрос в БД MySQL Вызов функции одной динамической библиотеки из другой динамической библиотеки Создание динамической библиотеки сортировок Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
|