OpenSSL 1.0.0-FIPS 符号查找错误
OpenSSL 1.0.0-FIPS Symbol Lookup Error
我写了一个使用 OpenSSL API 的 C++ SSL 套接字 class。如果重要的话,我使用的 OpenSSL 版本是 "OpenSSL 1.0.0-fips"。这个class属于我写的一个共享库。
我正在尝试为我的 class 编写一个简单的单元测试,但我无法获得要分配的 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++ 单元测试,我在其中尝试练习 class。
#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
当我执行单元测试时,出现以下错误:
[tlytle@vraptor3 test]$ TestSSLServer
TestSSLServer: symbol lookup error: TestSSLServer: undefined symbol: _ZN13TdlsSSLSocketC1EPK13ssl_method_st
奇怪的未定义符号 _ZN13TdlsSSLSocketC1EPK13ssl_method_st
几乎看起来 C++ 名称重整可能是罪魁祸首。但是,我尝试将 class 包装在 extern "C"
中,但我遇到了同样的错误。
有什么建议吗?
对于阅读本文的任何人来说,问题不在于 OpenSSL 库。未定义的符号问题意味着链接器无法解析给定的符号。我在单元测试二进制 TestSSLServer 上执行了 ldd
,它显示我没有链接到 libttshared.so
的当前版本。我将我的 LD_LIBRARY_PATH 变量设置为包含新共享库的目录和成功执行的程序。
我写了一个使用 OpenSSL API 的 C++ SSL 套接字 class。如果重要的话,我使用的 OpenSSL 版本是 "OpenSSL 1.0.0-fips"。这个class属于我写的一个共享库。
我正在尝试为我的 class 编写一个简单的单元测试,但我无法获得要分配的 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++ 单元测试,我在其中尝试练习 class。
#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
当我执行单元测试时,出现以下错误:
[tlytle@vraptor3 test]$ TestSSLServer
TestSSLServer: symbol lookup error: TestSSLServer: undefined symbol: _ZN13TdlsSSLSocketC1EPK13ssl_method_st
奇怪的未定义符号 _ZN13TdlsSSLSocketC1EPK13ssl_method_st
几乎看起来 C++ 名称重整可能是罪魁祸首。但是,我尝试将 class 包装在 extern "C"
中,但我遇到了同样的错误。
有什么建议吗?
对于阅读本文的任何人来说,问题不在于 OpenSSL 库。未定义的符号问题意味着链接器无法解析给定的符号。我在单元测试二进制 TestSSLServer 上执行了 ldd
,它显示我没有链接到 libttshared.so
的当前版本。我将我的 LD_LIBRARY_PATH 变量设置为包含新共享库的目录和成功执行的程序。