是否有任何链接器标志告诉在打开后延迟加载动态库

Is there any linker flag that tells to defer the loading of dynamic library after dlopen

本文关键字:延迟加载 动态 任何 链接 标志 是否      更新时间:2023-10-16

我有以下代码

  1. 文件 hello.cc

    static A dummyl;
    A:: A() {
        fun();
    }
    void A::fun() {
        int y = 10;
        int z = 20; 
        int x = y + z;
    }   
    
  2. 文件 hello.h

    class A {
      public:
        A a;
        void fun();
    };
    
  3. 文件 main.cc

    #include <dlfcn.h>
    #include "hello.h"
    typedef void (*pf)();
    int main() {
        void *lib;
        pf greet;
        const char * err;
        printf("n Before dlopenn");
        lib = dlopen("libhello.so", RTLD_NOW | RTLD_GLOBAL);
        if (!lib) {
            exit(1);
        }
        A *a = new A ;
        a->fun();
        dlerror(); /*first clear any previous error; redundant in this case but a useful habit*/
        dlclose(lib); 
        return 0;
    }
    

构建阶段:

  1. g++ -fPIC -c hello.cc
  2. g++ -shared -o libhello。所以hello.o
  3. g++ - 0 myprogram main。cc -ldl -L。-lhello

因为我的共享库在实际情况下是libQtCore。所以,我需要在链接器中使用-lQtCore来链接它,因为我不能直接使用符号,而且因为有许多函数然后libQtCore,实际上不建议使用 lysym对于libQtCore.so

的每个函数。因为我链接了,我的静态全局变量在打开之前被初始化。链接器g++是否有任何标志告诉编译器只在_dlopen _之后加载共享库?

链接器g++是否有任何标志告诉编译器只在_dlopen _之后加载共享库?

是的。在Windows上。这就是所谓的延迟加载。它在Linux/OS x上不存在。实现它是可能的,但需要修改binutils和ld.so。有关这方面的背景信息,请参阅本文。

但是你不需要关心的任何。真的。

你正面临着一个众所周知的问题。众所周知,它甚至有一个名字:静态初始化顺序惨败。

解决所有问题的方法很简单:不要像以前那样使用静态全局变量。

要修复它,使用Q_GLOBAL_STATIC,或自己重新实现类似的东西。这样,值将在第一次使用时被构造,而不是过早地构造。这就是全部。

旁注:你最近的问题受到了XY问题的严重影响。你试图想出各种各样的鲁布·戈德伯格式的解决方案来解决一个相当简单的问题,你花了一周多的时间才最终泄露出来。不要问潜在的解决方案,而要问你试图解决的潜在问题。所有库加载的东西都是与你的问题完全无关的,你根本不需要关心它。