当前位置:  技术问答>linux和unix

关于share library共享数据的问题!

    来源: 互联网  发布时间:2016-01-17

    本文导语:  我发现在share library中的全局变量,静态全局变量都是私有的,也就是说无法在多个加载这个库的进程中共享.我用google搜了一下,发现也有人遇到我这个问题,请问有人知道如何解决吗? 也就是说,如何实现进程A修改了一个...

我发现在share library中的全局变量,静态全局变量都是私有的,也就是说无法在多个加载这个库的进程中共享.我用google搜了一下,发现也有人遇到我这个问题,请问有人知道如何解决吗?
也就是说,如何实现进程A修改了一个共享库中定义的变量x,使另外一个也加载了这个共享库的进程中的x也发生变化.问题的英文描述如下:
Hi,

I wrote a shared library and I know the code of the
shared library  will be shared between different
applications. However,  the global data of the library
cannot be shared.

For example,  the code of the shared library looks
like 

// myshare.c
#include 

int global = 5;

void printGlobal()
{
        printf("Global=%dn",global);
}

void setGlobal(int g)
{
        global = g;
}

I used the following command to create the library
$gcc -fPIC -shared -o libmyshare.so myshare.c

The user application 1 links with it
//u1.c
#include 

extern void setGlobal(int);

int main()
{
        setGlobal(50);
        return 0;
}

I used the following command to create u1
$gcc -o u1 u1.c -L. -lmyshare

The user application 2 links with it too
//u2.c
#include 

extern void printGlobal(int);

int main()
{
        printGlobal();
        return 0;
}

I used the following command to create u2
$gcc -o u2 u2.c -L. -lmyshare

Then, I run u2 and u1
$u2
Global=5
$u1
$u2
Global=5

It seems that from u1, setGlobal(50) does not affect
the
print out of u2, which means, when u1 and u2 link with
the shared library libmyshare.so, there are two 
copies
of the global data in libmyshare.so.  So the code is
shared,
but not the global data.

My question is:  is there any way to share the global
data
within a shared library, i.e, both code and data can
be shared?

(I know I can use shared memory, but I wonder if we
can
do it using special compiler settings.)

|
按照我的理解两个进程使用一个共享库的时候只有.text段是共享的,也就是说只共享只读部分,比如 可执行 代码和符号表,这样同时使用同一个共享库的进程才可以互不干扰,保证正确性。而全局或静态变量应该是在.bss或者.data段的,所以连接到不同的程序中时会有不同的copy。

这是只有一个全局变量的共享库:
/*
 * file:     a.c
 *
 * target:   liba.so
 * command:  cc -fPIC -shared -o liba.so a.c
 */
int extern_var_in_so = 0;

这是调用上面共享库的可执行文件:
/*
 * file:     main.c
 *
 * target:   main.o
 * command:  cc -c main.c -o main.o
 *
 * target:   main
 * command:  cc main.o -L. -la -o main
 */
extern int extern_var_in_so;
int local_var_in_main = 0;

int main()
{
  return extern_var_in_so + local_var_in_main;
}

在使用cc -c main.c -o main.o编译完main.c时,用nm main.o查看main.o:
         U extern_var_in_so
00000000 B local_var_in_main
00000000 T main
可以看到,本地变量local_var_in_main的位置是在bss段;
而外部变量extern_var_in_so还是没有定位(undefined),需要在链接之后定位;

使用cc main.o -L. -la -o main命令把main.o, liba.so链接为可执行文件main,用nm main查看:
...
08049618 B extern_var_in_so
...
08049620 B local_var_in_main
...
注意到这里extern_var_in_so和local_var_in_main都在bss段里,没有什么区别。

以上是我个人理解,不一定准确,也许还是错误的,不过还是希望对你能有帮助。

    
 
 

您可能感兴趣的文章:

  • Linux 下c++开发error while loading shared libraries问题解决
  • 请问sco unix中出错:error while loading shared libraries : libxxx.so: cannot open shared object file
  • insight可以 debug shared library吗?
  • error while loading shared libraries:libncurses.so.4
  • error while loading shared libraries:在线等
  • 新手请教:关于shared library
  • proc时错误:error while loading shared libraries.....
  • cygwin——error while loading shared libraries:?
  • error while loading share library:libqte-mt.so.2:cannot open share object file
  • Make breakpoint pending on future shared library load? (y or [n])的問題
  • linux 隐式和显示使用share library 有什么本质的区别
  • error while loading shared libraries: libntopreport-3.4-pre2.so:cannot open 。。
  • 救命啊。。error while loading shared libraries
  • 关于HTTP headers 和 shared library (such as libxml)
  • 64位系统上编译运行32位程序,运行时出现Accessing a corrupted shared library
  • g++问题:编译出错Mismatched ABI. 64-bit PA shared library found in 32-bit link.
  • undefined reference to `main' & " error while loading shared libraries: "大家见过这个错误吗? MM 求助啦!
  • 如何设置samba里的share等级共享多个目录(path)
  • 请问:VMware中的VMware tools已装好了,共享文件夹也建好了,为share,那么我在linux系统中怎样看到这个文件夹呀
  • linux共享内存(share memory)与直接文件读取的区别
  • 每次重起机器,总不我的硬盘共享:后面加$,注释里写"DEFAULT SHARE",这是什么问题?怎么解决?
  • Oracle 共享服务器(Shared Server/MTS)的配置简析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • /usr/share/icon,和/usr/share/pixmap
  • jQuery 分享按钮插件 Share Button
  • 什么 mapping shared 哦?赐教
  • Vmware中share文件夹权限问题请教
  • shared object 必须是一个Object 吗?
  • relocatable与shared object的区别
  • share 文件意义?
  • ‘MAP_SHARED’ 未定义?
  • Java 科学计算包 Shared Scientific Toolbox
  • 如何在/usr/share/local目录下新增一个语言?
  • Linux 中裝HP Web jetadmin, 出現錯誤﹕cannot open shared object file
  • 命令用法 smbmount //server/share /mnt/server -o username=administrator
  • 谁有SecureCRT4.1.9的注册码?Share一下行吗?
  • Mounting HGFS shares: [失败]
  • gcc -shared -fpic malloc.c -o malloc.so
  • ip_rcv 中用skb_share_check是什么目的?
  • 新浪/腾讯微博分享的统一接口SDK android-share-sdk
  • linux 启动 错误:/sbin/init:errors while loading shared librar
  • The Eclipse executable launcher was unable to locate its companion shared librar
  • 为什么我的linux usr/share/fonts 为什么没有zh_CN目录呢,在线等!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3