Статус: Новичок
Группы: Участники
Зарегистрирован: 17.10.2014(UTC) Сообщений: 3  Откуда: Москва
|
При попытке вызова функции CryptAcquireContextW() из динамически-загружаемой библиотеки в Linux (RedHat Linux Enterprise Server 6.5 64-bit) происходит аварийное завершение программы. Цитата: #include <stdio.h> #include <dlfcn.h>
typedef int (*functype) (void*, void*, const void*, unsigned int, unsigned);
int main (int argc, char** argv) { void* module1 = dlopen("/opt/cprocsp/lib/amd64/libcapi10.so", RTLD_GLOBAL | RTLD_LAZY); void* module2 = dlopen("/opt/cprocsp/lib/amd64/libcapi20.so", RTLD_GLOBAL | RTLD_LAZY);
printf("module1 = 0x%08x, module2 = 0x%08x\n", module1, module2);
void* func1 = dlsym(module1, "CryptAcquireContextW"); void* func2 = dlsym(module2, "CryptAcquireContextW");
printf ("func1 = 0x%08x, func2 = 0x%08x\n", func1, func2);
functype* f = (functype*)(func1 ? func1 : func2);
char prov[256]; void* container = 0; const wchar_t* provider = L"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider"; unsigned type = 75; unsigned flags = 4026531840;
int ret = (*f)(&prov[0], container, provider, type, flags); printf("ret = %d\n", ret);
return 0; }
В частности, возникает ошибка сегментирования (segmentation fault). Вот вывод программы: Цитата: /usr/local/lib/64/libcurl.so: cannot open shared object file: No such file or directory module1 = 0x01f5b040, module2 = 0x01f5d8f0 func1 = 0x00a46a80, func2 = 0x00a46a80 Segmentation fault (core dumped)
Программа компилируется так: Цитата: g++ -Wall -w -g3 -c -o test.o test.cpp g++ -ldl -o test test.o
При запуске в отладчике: Цитата: [ruslan@cs-redhat6-satr ~]$ gdb ./test GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1) Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/ruslan/test...done. (gdb) r Starting program: /home/ruslan/test [Thread debugging using libthread_db enabled] support_dlopen() = 0x(nil) fail (1) /usr/local/lib/64/libcurl.so: cannot open shared object file: No such file or directory module1 = 0x00601040, module2 = 0x006038f0 func1 = 0xf7edea80, func2 = 0xf7edea80
Program received signal SIGSEGV, Segmentation fault. 0x0000000000400759 in main (argc=1, argv=0x7fffffffe5e8) at test.cpp:26 26 int ret = (*f)(&prov[0], container, provider, type, flags);
Неразрешенные зависимости в загружаемых библиотеках не обнаружены Цитата: [ruslan@cs-redhat6-satr ~]$ ldd -r /opt/cprocsp/lib/amd64/libcapi10.so linux-vdso.so.1 => (0x00007ffffabb3000) librdrsup.so.3 => /opt/cprocsp/lib/amd64/librdrsup.so.3 (0x00007f86e5b3d000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f86e5939000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f86e571b000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f86e5415000) libm.so.6 => /lib64/libm.so.6 (0x00007f86e5191000) libc.so.6 => /lib64/libc.so.6 (0x00007f86e4dfc000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f86e4be6000) /lib64/ld-linux-x86-64.so.2 (0x000000357f200000) [ruslan@cs-redhat6-satr ~]$ ldd -r /opt/cprocsp/lib/amd64/libcapi20.so linux-vdso.so.1 => (0x00007fffcb1ff000) libcpext.so.3 => /opt/cprocsp/lib/amd64/libcpext.so.3 (0x00007f2d4b0ec000) libcapi10.so.3 => /opt/cprocsp/lib/amd64/libcapi10.so.3 (0x00007f2d4afd8000) libasn1data.so.3 => /opt/cprocsp/lib/amd64/libasn1data.so.3 (0x00007f2d4a892000) librdrsup.so.3 => /opt/cprocsp/lib/amd64/librdrsup.so.3 (0x00007f2d4a77a000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f2d4a576000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2d4a358000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f2d4a052000) libm.so.6 => /lib64/libm.so.6 (0x00007f2d49dce000) libc.so.6 => /lib64/libc.so.6 (0x00007f2d49a39000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f2d49823000) /lib64/ld-linux-x86-64.so.2 (0x000000357f200000)
|