【问题标题】:Automatically generate import module for dynamic loading .so library自动生成动态加载.so库的导入模块
【发布时间】:2020-10-17 17:45:42
【问题描述】:

我希望将开源 3rdparty 库链接为 Linux 上动态加载的共享库。需要允许将其用作可选插件。它是适用于 C++ 库的 AWS-SDK,但对于问题和用作示例并不重要。我构建了 .so 库并可以静态链接它并在我的代码中使用它们的 API。当我从链接命令中删除库依赖并得到(如预期的那样):

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 知道他们的声明。有没有办法即时连接或自动生成这样的导入模块?

【问题讨论】:

    标签: c++ linux linker shared-libraries


    【解决方案1】:

    没有使用 GNU 工具执行此操作的内置方法,但可以轻松地自动生成必要的样板代码(dlopendlsym 等)(参见例如Implib.so project)。

    【讨论】:

    • @slonma 你能检查一下这是否回答了你的问题吗?
    猜你喜欢
    • 1970-01-01
    • 2018-03-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多