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

最近重温了一下《程序员修养》,又搞懂了一些叽里旮旯的问题,现将DSO同名全局变量问题进行简单小结,具体的讲解请看《程序员修养》一书。

程序员的自我修养—链接、装载与库.pdf版下载在Linux公社的1号FTP服务器里,下载地址:

在 2011年LinuxIDC.com\3月\程序员的自我修养—链接、装载与库

程序结构为可执行文件源码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

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

以上两种情况,究其原因,都是动态链接机制惹的祸,具体的分析各位看官,拜读一下《程序员的自我修养—链接、装载与库》吧,此处只为抛砖引玉,就不再班门弄斧了!0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux切换到字符界面stemctl,CentOS7两种模式

1.13 救援模式忘记root用户密码修改密码: 单用户模式(但只能物理机操作不能远程操作,gaub没加密或者知道gaub才能修改)忘记root用户密码修改密码: 单用户模式(但只能物理机操作不能远程操作,gaub没加密或者知道gaub才能修改)关机 …

山东科技大学c语言完全题库,“山东科技大学十大未解之谜”之完全解答

“山东科技大学十大未解之谜”之完全解答(2012-04-24 13:53:36)标签:娱乐当我还是一枚小正太刚刚进入山科大的时候,我就看到过这些未解之谜,现在每每看到童鞋们转发这篇经久不衰的文章并且表达自己的疑问,我作为一名资深理科技术宅…

android广播注册源码,android 广播源码简要分析-注册

android broadcast1,广播注册静态注册:在系统服务启动时会添加PackageManagerService,在该类的构造方法中就会对各个应用安装目录的apk文件进行扫描解析详细步骤1,PackageManagerService初始化的时候,扫描系统目录下的…

android盒子改造,【当贝市场】废旧手机改造成电视盒子详细教程

3.直接即可输出视频了,然后在手机上安装暴风影音等视频软件的tv版,即可开始观看。有人会说,旧手机电池不行,看一会儿就得没电,怎么办?首先,在你输出到电视时,你就可以给手机锁屏&…

android分辨率px跟dp,Android屏幕适配 px,dp,dpi及density的关系与深入理解

PX(pixel):即传统计算机语言中描述的像素,在Android则代表绝对像素。之所以Android中不推荐使用这种单位,正是因为不同生产厂商,不同品牌,不同屏幕的设备,其分辨率亦不一。举例来说,我们现在将某个Button的…

android 播放器 反交错,反交错- 视频横纹处理

以下名词解释摘自维基百科反交错”(deinterlacing)是将交错式(即隔行扫描)(interlace)影像讯号转换为渐进式(逐行扫描)(progressive)影像讯号的一种方法。因为装置处理速度以及带宽的限制下,广播电视系统,例如NTSC或是PAL,都是使用交错式讯号…

android webview简单使用,android WebView 简单使用Demo

activity配置文件:activity_main.xmlandroid:layout_width"match_parent"android:layout_height"match_parent"android:orientation"vertical" >android:layout_width"match_parent"android:layout_height"wrap_co…

android one x2,HTC One X 深度OS Android4.1.2 大气不失稳重 雍容华贵 流畅运行

您可能感兴趣的话题:rom刷机核心提示:注意事项:1. 本刷机教程需在windows操作系统下进行2. 刷机前确保手机电量不少于50%3. 为避免资料丢失,刷机前请先备份个人资料4. 本教程内容均来自于互联网并经N多网官方整理刷机前必看注意事…

android q全局夜间模式,安卓Q新功能全局夜间模式,网友:都9102年了,魅族Flyme早就有...

原标题:安卓Q新功能全局夜间模式,网友:都9102年了,魅族Flyme早就有目前市面上的智能手机系统基本是苹果的iOS和谷歌的安卓两分天下,其中,安卓系统的用户分布更加广泛。近日,安卓Q系列被正式曝光…

android 教程概要,Android精通教程-第一节Android入门简介

前言大家好,我是 Vic,今天给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢每日一句If life were predictable it would cease to be life, and be without flavor.--- Eleanor Roosevelt每日一句入门工具的安装第一步&a…

市场销售的计算机主机硬盘主要有,一种具有旋转功能的计算机硬盘销售架的制作方法...

本实用新型涉及硬盘销售技术领域,具体为一种具有旋转功能的计算机硬盘销售架。背景技术:硬盘是电脑主要的存储媒介之一,由一个或者多个铝制或者玻璃制的碟片组成,碟片外覆盖有铁磁性材料,硬盘有固态硬盘、机械硬盘和混…

计算机设备中找不到网络适配器,驱动技巧:解决设备管理器中找不到网卡的问题...

类型:网卡问题:设备管理器中找不到网卡,因此驱动精灵万能网卡版无法安装网卡驱动解决方案:操作步骤:1、首先确认是否有网卡查看电脑周边接口有无RJ45网线接口。一般在后面。如下图所示:2、若电脑配置有网卡&#xff0c…

计算机原理2408,《计算机组成原理实验》课程教学大纲

《计算机组成原理实验》课程教学大纲教学模块(章)教学目标基本运算器试验了解运算器的组成结构,掌握运算器的工作原理。静态随机存储器实验掌握静态随机存储器 RAM 工作特性及数据的读写方法。微程序控制器实验掌握微程序控制器的组成原理,掌握微程序的编…

win7计算机双击变管理,如何修复Win7系统鼠标单击以双击

鼠标在计算机中的位置非常重要。就像我们的指南针。我们需要的是,只需移动并单击它即可。然后最近,Windows 7 Ultimate 64位系统用户报告说win7鼠标的单击已更改为双击,这种情况无疑给我们的常规操作增加了麻烦,让我们看一下如何解…

量子计算机功率,量子计算功耗知多少

邻家怪蜀黍 2015.10.06 , 10:06 pm——量子计算功耗知多少google的量子智能实验室刚刚制造的最新的计算机可能是目前第一台商业量子计算机了。而这台新型的计算机能够比传统计算机更快的、使用相对更少的功耗来完成相同的计算任务。不过量子计算到底能节约多少功耗目前还是个迷…

升级计算机方案,关于计算机升级方案

2004-12-28cpu 赛扬D2.4G 内存 金士顿256M DDR400 硬盘 酷鱼80G 7200转 液晶显示器用明基或三星的2500元左右 想问主板用华硕什么样的好?用华硕845PE的行不行?与什么样的显卡相配,注:并不玩大型游戏?CPU: 赛扬4 2。0G …

网易126邮箱服务器设置,网易闪电邮企业邮箱设置教程(POP3)

原标题:网易闪电邮企业邮箱设置教程(POP3)使用网易闪电邮收发企业邮箱邮件,下面是设置教程1、启动闪电邮后,点击“邮箱---新建邮箱账户”菜单,如下图:2、输入“邮箱地址和密码”,点击下拉箭头继续设置&…

django2与ajax,Python-Django-Ajax进阶2

-forms组件的渲染错误信息在模板中:{{ foo.errors.0 }}-forms使用bootstrap样式widgetwidgets.EmailInput(attrs{class:form-control}))-全局和局部钩子函数AOP:面向切面编程-局部钩子函数(再校验name)def clean_name(self):# 从cleaned_data中取出字段的值name self.cleaned_…

java方法的传递方式_JAVA基础--方法传参

JAVA基础--方法传参为啥拿这个当话题?在初学者阶段,许多童鞋都对方法传参比较迷茫,知其然不知其所以然。一.先说说参数传递的几个术语:值调用(call by vale):表示方法接收的是调用者传递的值。引用调用(call by reference):表示方…

java udp 协议_网络协议 - UDP 协议详解

网络协议 - UDP 协议详解 基于TCP和UDP的协议非常广泛,所以也有必要对UDP协议进行详解。pdai UDP概述UDP(User Datagram Protocol)即用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第…