|
0 / 0 / 0
Регистрация: 20.01.2012
Сообщений: 14
|
||||||
Создание динамической библиотеки для СУБД Oracle02.02.2012, 12:44. Показов 7521. Ответов 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 Вызов функции одной динамической библиотеки из другой динамической библиотеки Создание динамической библиотеки сортировок Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|