GCC如何处理共享库中的static变量的啊

发布于 2022-09-26 11:56:45 字数 67 浏览 19 评论 0

如a.so b.so中间都有static int c
a.so中c变化时,b.so中c是否也变化呢?如果不想变,该怎么办?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

红焚 2022-10-03 11:56:45

这两个可不是同一个c

嘿嘿嘿 2022-10-03 11:56:45

可是发现c确实变化了

静水深流 2022-10-03 11:56:45

我在windows vc下执行正常的(c是不变的)

妳是的陽光 2022-10-03 11:56:45

nm a.so b.so我看看

微凉徒眸意 2022-10-03 11:56:45


完全可能。我在gcc+linux上遇到过。
static标示名字会被export的。所以,同一进程内会产生覆盖。

北斗星光 2022-10-03 11:56:45

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

转瞬即逝 2022-10-03 11:56:45

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

风渺 2022-10-03 11:56:45

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

末骤雨初歇 2022-10-03 11:56:45

那里面根本就没有c啊,你用的是哪个c?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文