2017-01-27 10 views
0

Я написал класс 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", но я получил ту же ошибку.

Любые предложения?

+0

Относительно * «Я не могу получить структуру SSL_CTX для распределения ...» * - Означает ли это, что это NULL? Если это так, из [Инициализация библиотеки] (https://wiki.openssl.org/index.php/Library_Initialization) в вики OpenSSL: * «Если вы не можете инициализировать библиотеку, тогда вы будете испытывать необъяснимые ошибки, такие как SSL_CTX_new, возвращающий NULL , сообщения об ошибках, такие как SSL_CTX_new: библиотека не имеет шифров и сбоев при сбое вызова без общих шифров »*. – jww

+0

Относительно * '_ZN13TdlsSSLSocketC1EPK13ssl_method_st' *:' $ echo _ZN13TdlsSSLSocketC1EPK13ssl_method_st | C++ filt' возвращает 'TdlsSSLSocket :: TdlsSSLSocket (ssl_method_st const *)'. Используйте 'nm', чтобы увидеть, присутствует ли этот символ. Попробуйте выполнить «TestSSLServer.o» и «libttshared.so». – jww

+0

Ошибка, которая выводится, появляется из реализации OpenSSL. Например, это не исключение std :: runtime_error, вызывающее прерывание программы. Я даже не думаю, что он дошел до проверки, является ли ctx NULL. Я считаю, что функция SSL_CTX_new() прерывает программу и выплескивает неопределенную ошибку символа. –

ответ

0

Для всех, кто читает это, проблема не в библиотеке OpenSSL. Неопределенная проблема символа означает, что компоновщик не может разрешить данный символ. Я выполнил ldd на тестовом двоичном тестовом сервере TestSSLServer и показал, что я не связывался с текущей версией libttshared.so. Я установил переменную LD_LIBRARY_PATH для включения каталога новой общей библиотеки и успешно выполненной программы.

 Смежные вопросы

  • Нет связанных вопросов^_^