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 变量设置为包含新共享库的目录和成功执行的程序。