GCC如何处理共享库中的static变量的啊
如a.so b.so中间都有static int c
a.so中c变化时,b.so中c是否也变化呢?如果不想变,该怎么办?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如a.so b.so中间都有static int c
a.so中c变化时,b.so中c是否也变化呢?如果不想变,该怎么办?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(9)
这两个可不是同一个c
可是发现c确实变化了
我在windows vc下执行正常的(c是不变的)
nm a.so b.so我看看
完全可能。我在gcc+linux上遇到过。
static标示名字会被export的。所以,同一进程内会产生覆盖。
a.h内容
#if !defined(__A_H_)
#define __A_H_
void a();
#endif
a.cc 内容
#include <stdlib.h>
#include <stdio.h>
#include "a.h"
static int i;
void c()
{
printf("1a %d\n",i);
i++;
printf("2a %d\n",i);
}
void a()
{
c();
}
b.h内容
#if !defined(__B_H_)
#define __B_H_
void b();
#endif
b.cc 内容
#include <stdlib.h>
#include <stdio.h>
static int i;
void c()
{
printf("1b %d\n",i);
i++;
printf("2b %d\n",i);
}
void b()
{
c();
}
main.cc 内容
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "a.h"
#include "b.h"
int main(int argc,char *argv[])
{
a();
sleep(1);
b();
}
a.cc和b.cc生成共享文件liba.so libb.so
main执行时;
1a 0
2a 1
1a 1
2a 2
nm liba.so的内容
00001768 d DW.ref.__gxx_personality_v0
00001658 a _DYNAMIC
00001744 a _GLOBAL_OFFSET_TABLE_
w _Jv_RegisterClasses
00000544 T _Z1av
000004ec T _Z1cv
00001648 d __CTOR_END__
00001644 d __CTOR_LIST__
00001650 d __DTOR_END__
0000164c d __DTOR_LIST__
00000640 r __FRAME_END__
00001654 d __JCR_END__
00001654 d __JCR_LIST__
0000176c A __bss_start
w __cxa_finalize@@GLIBC_2.1.3
00000570 t __do_global_ctors_aux
00000450 t __do_global_dtors_aux
00001760 d __dso_handle
w __gmon_start__
U __gxx_personality_v0@@CXXABI_1.3
000004e7 t __i686.get_pc_thunk.bx
0000176c A _edata
00001774 A _end
000005a4 T _fini
000003b8 T _init
00000420 t call_gmon_start
0000176c b completed.5758
000004b0 t frame_dummy
00001770 b i
00001764 d p.5756
U printf@@GLIBC_2.0
nm libb.so内容跟上面的是一样的
00001768 d DW.ref.__gxx_personality_v0
00001658 a _DYNAMIC
00001744 a _GLOBAL_OFFSET_TABLE_
w _Jv_RegisterClasses
00000544 T _Z1bv
000004ec T _Z1cv
00001648 d __CTOR_END__
00001644 d __CTOR_LIST__
00001650 d __DTOR_END__
0000164c d __DTOR_LIST__
00000640 r __FRAME_END__
00001654 d __JCR_END__
00001654 d __JCR_LIST__
0000176c A __bss_start
w __cxa_finalize@@GLIBC_2.1.3
00000570 t __do_global_ctors_aux
00000450 t __do_global_dtors_aux
00001760 d __dso_handle
w __gmon_start__
U __gxx_personality_v0@@CXXABI_1.3
000004e7 t __i686.get_pc_thunk.bx
0000176c A _edata
00001774 A _end
000005a4 T _fini
000003b8 T _init
00000420 t call_gmon_start
0000176c b completed.5758
000004b0 t frame_dummy
00001770 b i
00001764 d p.5756
U printf@@GLIBC_2.0
那里面根本就没有c啊,你用的是哪个c?