自动生成动态加载.so库的导入模块
Automatically generate import module for dynamic loading .so library
我想要 link 开源 3rdparty 库作为 Linux 上的动态加载共享库。需要允许将其用作可选插件。它是适用于 C++ 库的 AWS-SDK,但对于问题和用作示例并不重要。我构建了 .so 库并可以静态 link 它并在我的代码中使用它们 API 。当我从 link 命令中删除库依赖项并得到(如预期的那样)时:
GNU ld (GNU Binutils) 2.28
CMakeFiles/ed_core.dir/core/AmazonS3Client.cpp.o: In function `ed::amazons3client::(anonymous namespace)::AwsInit::AwsInit()':
/devroot/develop/src/core/AmazonS3Client.cpp:61: undefined reference to `Aws::InitAPI(Aws::SDKOptions const&)'
/devroot/develop/src/core/AmazonS3Client.cpp:62: undefined reference to `Aws::Utils::Logging::InitializeAWSLogging(std::shared_ptr<Aws::Utils::Logging::LogSystemInterface> const&)'
CMakeFiles/ed_core.dir/core/AmazonS3Client.cpp.o: In function `ed::amazons3client::(anonymous namespace)::AwsInit::~AwsInit()':
/devroot/develop/src/core/AmazonS3Client.cpp:68: undefined reference to `Aws::Utils::Logging::ShutdownAWSLogging()'
/devroot/develop/src/core/AmazonS3Client.cpp:69: undefined reference to `Aws::ShutdownAPI(Aws::SDKOptions const&)'
CMakeFiles/ed_core.dir/core/AmazonS3Client.cpp.o: In function `ed::amazons3client::MultipartSink::init[abi:cxx11]()':
/devroot/develop/src/core/AmazonS3Client.cpp:550: undefined reference to `Aws::S3::Model::CreateMultipartUploadRequest::CreateMultipartUploadRequest()'
....
所以现在我需要手动编写导入模块,其中将通过 dlopen() 加载 .so,声明指向所需符号的指针,通过 dsym() 初始化此类符号,并通过存根重定向对未定义函数的符号调用。
有什么不同的方法吗? LD 知道需要什么符号。 GCC 知道他们的声明。有什么方法可以即时连接或自动生成这样的导入模块吗?
没有使用 GNU 工具的内置方法来执行此操作,但可以轻松地自动生成必要的样板代码(dlopen
、dlsym
等)(参见 Implib.so project).
我想要 link 开源 3rdparty 库作为 Linux 上的动态加载共享库。需要允许将其用作可选插件。它是适用于 C++ 库的 AWS-SDK,但对于问题和用作示例并不重要。我构建了 .so 库并可以静态 link 它并在我的代码中使用它们 API 。当我从 link 命令中删除库依赖项并得到(如预期的那样)时:
GNU ld (GNU Binutils) 2.28
CMakeFiles/ed_core.dir/core/AmazonS3Client.cpp.o: In function `ed::amazons3client::(anonymous namespace)::AwsInit::AwsInit()':
/devroot/develop/src/core/AmazonS3Client.cpp:61: undefined reference to `Aws::InitAPI(Aws::SDKOptions const&)'
/devroot/develop/src/core/AmazonS3Client.cpp:62: undefined reference to `Aws::Utils::Logging::InitializeAWSLogging(std::shared_ptr<Aws::Utils::Logging::LogSystemInterface> const&)'
CMakeFiles/ed_core.dir/core/AmazonS3Client.cpp.o: In function `ed::amazons3client::(anonymous namespace)::AwsInit::~AwsInit()':
/devroot/develop/src/core/AmazonS3Client.cpp:68: undefined reference to `Aws::Utils::Logging::ShutdownAWSLogging()'
/devroot/develop/src/core/AmazonS3Client.cpp:69: undefined reference to `Aws::ShutdownAPI(Aws::SDKOptions const&)'
CMakeFiles/ed_core.dir/core/AmazonS3Client.cpp.o: In function `ed::amazons3client::MultipartSink::init[abi:cxx11]()':
/devroot/develop/src/core/AmazonS3Client.cpp:550: undefined reference to `Aws::S3::Model::CreateMultipartUploadRequest::CreateMultipartUploadRequest()'
....
所以现在我需要手动编写导入模块,其中将通过 dlopen() 加载 .so,声明指向所需符号的指针,通过 dsym() 初始化此类符号,并通过存根重定向对未定义函数的符号调用。
有什么不同的方法吗? LD 知道需要什么符号。 GCC 知道他们的声明。有什么方法可以即时连接或自动生成这样的导入模块吗?
没有使用 GNU 工具的内置方法来执行此操作,但可以轻松地自动生成必要的样板代码(dlopen
、dlsym
等)(参见 Implib.so project).