| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C程序运行原理与程序重定位原理 -> 正文阅读 |
|
[C++知识库]C程序运行原理与程序重定位原理 |
我们编译生成目标文件,子程序跳转时候,其实用的都是相对地址跳转,比如目标程序标号距离当前程序(pc指针的值)的偏移,然后跳转过去即可。访问全局变量也是如此,编译器分配的全局变量距离当前pc的相对偏移,访问就是了。 但是,当我们的data段(全局变量)需要搬移到其它位置时候,这个相对偏移,就出错了。 为了解决代码运行时重定位问题,我们的程序编译时候加上-fpic选项,生成的就是与地址无关的代码。编译器会在目标文件text段末尾加上一个全局符号表(程序中可以通过__rel_dyn_start引用)。所有的全局变量都会在该表进行地址登记,而程序中要访问该全局变量也从之前的偏移访问变成新的方式:先从pc通过固定偏移找到这个表中该全局变量的地址,再通过该地址访问到那个全局变量。当我们的data段(全局变量)需要搬移到其它位置时候,我们只需要写程序去更新这个表,也就是修改这里面的符号的地址(根据自己想要重定位的位置偏移更新进去),这样就能照样正常运行了。 这个代价就是,访问全局的东西时候,需要两次才能访问到数据,效率低了一点,此外,生成的目标文件也会大一些。 uboot中,就有这种骚操作,还是很有意思的。 推荐参考一本书:嵌入式C语言自我修养,讲得通俗易懂,很不错。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 10:29:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |