栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C程序运行原理与程序重定位原理

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C程序运行原理与程序重定位原理

我们编译生成目标文件,子程序跳转时候,其实用的都是相对地址跳转,比如目标程序标号距离当前程序(pc指针的值)的偏移,然后跳转过去即可。访问全局变量也是如此,编译器分配的全局变量距离当前pc的相对偏移,访问就是了。

但是,当我们的data段(全局变量)需要搬移到其它位置时候,这个相对偏移,就出错了。

为了解决代码运行时重定位问题,我们的程序编译时候加上-fpic选项,生成的就是与地址无关的代码。编译器会在目标文件text段末尾加上一个全局符号表(程序中可以通过__rel_dyn_start引用)。所有的全局变量都会在该表进行地址登记,而程序中要访问该全局变量也从之前的偏移访问变成新的方式:先从pc通过固定偏移找到这个表中该全局变量的地址,再通过该地址访问到那个全局变量。当我们的data段(全局变量)需要搬移到其它位置时候,我们只需要写程序去更新这个表,也就是修改这里面的符号的地址(根据自己想要重定位的位置偏移更新进去),这样就能照样正常运行了。

这个代价就是,访问全局的东西时候,需要两次才能访问到数据,效率低了一点,此外,生成的目标文件也会大一些。

uboot中,就有这种骚操作,还是很有意思的。

推荐参考一本书:嵌入式C语言自我修养,讲得通俗易懂,很不错。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/690992.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号