GCC如何处理共享库中的static变量的啊
如a.so b.so中间都有static int ca.so中c变化时,b.so中c是否也变化呢?如果不想变,该怎么办? 这两个可不是同一个c 可是发现c确实变化了 我在windows vc下执行正常的(c是不变的) nm a.so b.so我看看 :mrgreen:
完全可能。我在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?
页:
[1]
2