linux内核全局变量同名,Linux系统下DSO同名全局变量浅析

程序结构为可执行文件源码main.c,动态库源码Func1.c,Func2.c,代码如下:

#include

extern void Func1();

extern void Func2();

extern int g_var;

int main()

{

Func1();

Func2();

return 0;

}

#include

int g_var = 11;

void Func1()

{

printf("Func1-->%d\n",g_var);

}

#include

int g_var = 22;

void Func2()

{

printf("Func2-->%d\n",g_var);

}

在CentOS5.5+gcc 4.1.2编译成功

g++ -g -shared -fPIC Func1.c -o libFunc1.so

g++ -g -shared -fPIC Func2.c -o libFunc2.so

g++ -g -L. -lFunc2 -lFunc1 -Wl,-rpath,. main.c -o main

./main 输出如下

Func1-->22

Func2-->22

为什么呢?

g++ -g -L. -lFunc2 -lFunc1-Wl,-rpath,. main.c -o main

因为动态链接器是先将Func2.so链接到进程虚拟空间,如果将编译命令变为

g++ -g -L. -lFunc1 -lFunc2-Wl,-rpath,. main.c -o main

则输出变为:

Func1-->11

Func2-->11

由此说明,不论进程所链接的动态库中有多少同名的全局变量,在进程虚拟空间内只有一份变量实体,所有的同名变量都会指向此实体,因此Func1.so和Func2.so中的g_var值是一致的。

再来修改一下main.c:

#include

extern void Func1();

extern void Func2();

int g_var;

int main()

{

Func1();

Func2();

return 0;

}

程序输出是什么呢?

Func1-->0

Func2-->0

没错,当可执行程序中已存在同名全局对象实体,则所有的动态库中的同名全局对象都会指向它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值