环境:Intel Linux,Red Hat 5。编译器:gcc 3.4.6(旧东西,具有严重基础设施的遗留环境,抱歉)
我有从 Fortran 派生的特定共享库的多个版本(称之为“shared_lib.so”),其中包含一个 COMMON 块和各种计算,并引用了该 COMMON 中的变量。
我需要能够(从最终产品可执行文件中其他地方的 C 代码)在运行时使用 dlclose() 和 dlopen() 在这个库的版本之间切换(其中所有版本的 COMMON 内容都是相同的)。在某些情况下,相同的 COMMON 也出现在作为静态库(称为“static_lib.a”)的一部分的代码中,该库也链接到可执行文件中,并且与我的项目分开维护,但具有与我的共享库。
我似乎看到 COMMON 的多个实例最终出现在可执行文件中,并且(更重要的是)静态库中实例中的变量值与中“相同”变量的值之间没有联系使用 dlopen() 拉入的共享库中的实例。
总之,我需要的是(在整个可执行文件中)加载 dlopen() 的 shared_lib.so 能够在 COMMON ABC 中设置/使用变量 XYZ,以及 static_lib.a 中的代码设置/使用 XYZ,并使其实际上是 XYZ 的同一个实例,或者至少使两者保持同步。这可能吗?
我对 shared_lib.so 中源代码的编译命令格式如下:
g77 –c –g –m32 -fPIC –o shared_src.o shared_src.f
我构建 shared_lib.so 的命令形式如下:
gcc -g -m32 -fPIC -shared -o shared_lib.so *.o
我构建可执行文件的命令格式如下:
gcc –g -m32 –rdynamic –o exec exec.o static_lib.a shared_lib.so –lm –ldl –lg2c
我需要从表单的 C 代码中做一些事情:
handle1 = dlopen ("shared_lib.so", RTLD_NOLOAD);
dlclose (handle1);
handle2 = dlopen ("shared_lib2.so", RTLD_NOW | RTLD_GLOBAL);
...
初始启动配置在所需变量方面确实似乎运行正常,但后续 dlclose() 和 dlopen() 序列的结果却没有。也许根本问题是 dlopen() 缺乏 gcc 在链接时拥有的一些智能。