Я написал класс SSL SSL Socket, который использует API OpenSSL. Версия OpenSSL, которую я использую, это «OpenSSL 1.0.0-fips», если это имеет значение. Этот класс принадлежит к общей библиотеке, которую я написал.OpenSSL 1.0.0-FIPS Ошибка поиска символов
Я пытаюсь записать модульный тест на боковые кости моего класса, и я не могу выделить структуру SSL_CTX.
Вот мой файл заголовка:
#ifndef __TDLS_SSL_SOCKET_HPP__
#define __TDLS_SSL_SOCKET_HPP__
#include <stdexcept>
#include <openssl/ssl.h>
#include <openssl/x509v3.h>
#include <openssl/err.h>
class TdlsSSLSocket
{
public:
TdlsSSLSocket(const SSL_METHOD* method);
protected:
SSL_CTX* ctx;
};
#endif
Вот реализация конструктора:
#include "TdlsSSLSocket.hpp"
TdlsSSLSocket::TdlsSSLSocket(const SSL_METHOD* method)
{
ctx = SSL_CTX_new(method);
if(!ctx)
{
throw std::runtime_error("Failed to initialize SSL CTX object");
}
}
Вот как я скомпилировать этот исходный код:
g++ -fPIC -g -O2 -Wall -c -o TdlsSSLSocket.o TdlsSSLSocket.cpp
ld -r TdlsTCPSocket.o TdlsTCPClient.o TdlsTCPServer.o ReferenceCounter.o TdlsSSLSocket.o -o socket.o
Вот как я создаю общую библиотеку:
g++ -shared -Wl,-soname,libttshared.so.2 -lssl -o libttshared.so.2.0 logger/log.o conf/conf_objs.o seq/seq.o socket/socket.o
Вот мой модульный тест на C++, где я пытаюсь реализовать класс.
#include <iostream>
#include "TdlsSSLSocket.hpp"
using namespace std;
int main(int argc, char* argv[])
{
SSL_library_init();
SSL_load_error_strings();
TdlsSSLSocket ssl_server(TLSv1_method());
}
И строить его так:
g++ -o TestSSLServer TestSSLServer.o ../../libttshared.so -L../.. -lttshared
И когда я выполнить тест блока, я получаю следующее сообщение об ошибке:
[[email protected] test]$ TestSSLServer
TestSSLServer: symbol lookup error: TestSSLServer: undefined symbol: _ZN13TdlsSSLSocketC1EPK13ssl_method_st
Странная неопределенными символ _ZN13TdlsSSLSocketC1EPK13ssl_method_st
выглядит почти Могло быть названо имя C++. Но, я попробовал обернуть класс в extern "C"
, но я получил ту же ошибку.
Любые предложения?
Относительно * «Я не могу получить структуру SSL_CTX для распределения ...» * - Означает ли это, что это NULL? Если это так, из [Инициализация библиотеки] (https://wiki.openssl.org/index.php/Library_Initialization) в вики OpenSSL: * «Если вы не можете инициализировать библиотеку, тогда вы будете испытывать необъяснимые ошибки, такие как SSL_CTX_new, возвращающий NULL , сообщения об ошибках, такие как SSL_CTX_new: библиотека не имеет шифров и сбоев при сбое вызова без общих шифров »*. – jww
Относительно * '_ZN13TdlsSSLSocketC1EPK13ssl_method_st' *:' $ echo _ZN13TdlsSSLSocketC1EPK13ssl_method_st | C++ filt' возвращает 'TdlsSSLSocket :: TdlsSSLSocket (ssl_method_st const *)'. Используйте 'nm', чтобы увидеть, присутствует ли этот символ. Попробуйте выполнить «TestSSLServer.o» и «libttshared.so». – jww
Ошибка, которая выводится, появляется из реализации OpenSSL. Например, это не исключение std :: runtime_error, вызывающее прерывание программы. Я даже не думаю, что он дошел до проверки, является ли ctx NULL. Я считаю, что функция SSL_CTX_new() прерывает программу и выплескивает неопределенную ошибку символа. –