【发布时间】:2014-11-18 23:53:27
【问题描述】:
环境:英特尔 Linux、红帽 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 在链接时所拥有的一些智能。
【问题讨论】:
标签: c fortran visibility dlopen fortran-common-block