【问题标题】:How are static globals handled in multiple modules?在多个模块中如何处理静态全局变量?
【发布时间】:2012-03-05 23:40:50
【问题描述】:

在 C 语言中,在全局级别(在任何函数之外)声明变量 static 表示它仅对该链接器对象(通常是该 .C 文件)可见。

如果同一个 .C 文件是多个不同库的一部分,然后在单个可执行文件中链接在一起,是否会发生冲突?

例如:

我的文件.c

typedef struct {
   [my important data];
} MyGlobalType;

static MyGlobalType globalData = { [...data...] };

如果我有:

Plugin_Alpha.so由 MyFile.C + AlphaSource.C 组成
Plugin_Beta.so由 MyFile 组成.C + BetaSource.C
MainProgram.exe由 MainCode.C 组成(加载两个插件)

Plugin_Alpha 和 Plugin_Beta 是否有独立的 globalData 副本? 还是它们最终会引用相同的结构?

【问题讨论】:

    标签: c plugins static global


    【解决方案1】:

    嗯,这是找出答案的一种方法:

    文件liba.c

    static int globalData;
    
    int *GetGlobalData() { return &globalData; }
    

    编译成两个独立的共享库:

    $ gcc liba.c -o liba.so -fPIC -shared
    $ gcc liba.c -o libb.so -fPIC -shared
    

    主程序:

    #include <dlfcn.h>
    #include <stdio.h>
    
    int main(void)
    {
      // Error checking omitted for expository purposes
    
      void *liba = dlopen("liba.so", RTLD_LAZY);
      void *libb = dlopen("libb.so", RTLD_LAZY);
    
      typedef int* (*FuncV_IP)(void);
      FuncV_IP funca = (FuncV_IP)dlsym(liba, "GetGlobalData");
      FuncV_IP funcb = (FuncV_IP)dlsym(libb, "GetGlobalData");
    
      printf("Module A: GetGlobalData() ==> %p\n", funca());
      printf("Module B: GetGlobalData() ==> %p\n", funcb());
    
      dlclose(liba);
      dlclose(libb);
    
      return 0;
    }
    

    编译并运行它:

    $ gcc main.c -ldl
    $ LD_LIBRARY_PATH=. ./a.out
    

    输出:

    Module A: GetGlobalData() ==> 0x7fa97536d020
    Module B: GetGlobalData() ==> 0x7fa97516b020
    

    因此,每个共享库都有自己的全局变量副本。

    【讨论】:

      猜你喜欢
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多