第013课_代码重定位
第013课 代码重定位
1. 段的概念_重定位的引入
2. 链接脚本的引入与简单测试
参考资料:
Using LD, the GNU linker
http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html
3. 链接脚本的解析
4. 拷贝代码和链接脚本的改进
a. 拷贝代码要改进
b. 链接脚本要改进
5. 代码重定位与位置无关码
怎么写位置无关的程序:
使用位置无关码! 不使用绝对地址! 最根本的办法是看反汇编
a. 调用程序时使用B/BL相对跳转指令
b. 重定位之前, 不可使用绝对地址,比如:
不可访问全局变量/静态变量
不可访问有初始值的数组(因为初始值放在rodata里,使用绝对地址来访问)
c. 重定位之后, 使用绝对跳转命令跳到Runtime Addr,比如:
ldr pc, =main
6. 重定位_清除BSS段的C函数实现
C代码中如何使用链接脚本中定义的变量
http://www.100ask.org/bbs/forum.php?mod=viewthread&tid=16231&highlight=%C1%B4%BD%D3%BD%C5%B1%BE
参考文章:https://sourceware.org/ml/binutils/2007-07/msg00154.html
C函数怎么使用lds文件中的变量abc?
a. 在C函数中声明改变量为extern类型, 比如:
extern int abc;
b. 使用时, 要取址, 比如:
int *p = &abc; // p的值即为lds文件中abc的值
作业:
(1).使用printf函数打印以下信息:
volatile unsigned int *dest = (volatile unsigned int *)&__code_start;
volatile unsigned int *end = (volatile unsigned int *)&__bss_start;
volatile unsigned int *src = (volatile unsigned int *)0;
a. 打印dest, end, src的值
b. 打印dest, end, src所指向的地址的值
(2). 修改链接脚本,把程序重定位到0x32000000
再观察上述打印结果
转载于:https://www.cnblogs.com/Dream998/p/8540612.html
第013课_代码重定位相关推荐
- C语言重新定位文件,C语言代码重定位 (原创)
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 原贴:http://hi.baidu.com/ciw%5Fblue/blog/item/ec2cc251998c07888d543054.html 许多人 ...
- S5PV210体系结构与接口04:代码重定位 SDRAM初始化
目录 1. C语言环境初始化 1.1 C语言运行所需环境 1.2 初始化栈 1.2.1 栈的概念 1.2.2 栈的作用 1.2.3 如何初始化 1.3 初始化bss段 1.3.1 bss段的作用 1. ...
- Tiny4412裸机程序之代码重定位初体验
转载:http://www.techbulo.com/1412.html 从前面一节Exynos 4412的启动过程分析 ,我们知道:一上电,exynos4412首先执行固化在IROM中的代码,iRO ...
- Linux从头学06:16张结构图,彻底理解【代码重定位】的底层原理
作 者:道哥,10+年的嵌入式开发老兵. 转 载:欢迎转载文章,转载需注明出处. 文章目录 程序的结构 1. 程序头(Header)的描述信息 2. 关于汇编地址 bootloader 把程序从硬盘读 ...
- 免疫性属于计算机病毒特征码,基于免疫和代码重定位的计算机病毒特征码提取与检测方法.doc...
基于免疫和代码重定位的计算机病毒特征码提取与检测方法 基于免疫和代码重定位的计算机病毒特征码提取与检测方法 张瑜 LIU Qing-zhong 宋丽萍 罗自强 曹均阔 海南师范大学信息学院 Depar ...
- 共享可写节包含重定位_理解重定位
一.段的概念 段是程序的组成元素.将整个程序分成一个一个段,并且给每个段起一个名字,然后在链接时就可以用这个名字来指示这些段,使得这些段排布在合适的位置. 一个程序通常包含以下五个段: 代码段(.te ...
- Tiny6410之重定位代码到SDRAM
在上一章中,将代码重定位到了SRAM中,但是这样的做法作用不大.正确的做法的是将代码重定位到更大的主存中,即DRAM.Tiny6410的DRAM控制寄存器最多只能支持两个同一类型的芯片.每个芯片最多可 ...
- 嵌入式裸机课程之C语言程序调用和重定位学习笔记
一.汇编写启动代码之关看门狗 前期准备工作 1.1 什么是看门狗 看门狗(watchdog timer)电子设备经常会跑飞或者死机(譬如极端炎热.极端寒冷.工业复杂场合) 这种情况我们需要设备自动复位 ...
- tiny4412 裸机程序 六、重定位代码到IRAM+0x8000【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37115697 一.重定向 对于程序而言,我们需要理解两个概念,一是程序当前所处的地址,即程序在运 ...
最新文章
- 他山之石:Github的使用
- 零知识证明实践教程,第一部分
- 车小米O2O保养平台搭建完毕
- linux安装mysql5.7.18_Linux 安装MySQL5.7.18
- MySQL常用存储引擎之MyISAM
- PHP反射之类的反射
- 数据结构基础学习(一)数组
- 浅谈Flutter UI布局
- Java 网络爬虫,就是这么的简单
- win hook codeproject
- 小程序模仿蚂蚁森林浇水demo,树木浇水
- JDBC execute常用方法
- 软件工程课程设计分组与选题名单
- 电脑连接手机热点时,电脑能够搜到但是却连接不上的问题
- 新冠肺炎的中西医结合康复方案
- VS2019 - 动态库的编写和调用
- java:Cassandra入门与实战——下
- WebServer报错Unexpected wrapper element
- 江汉大学计算机学院有研究生院,江汉大学研究生招生信息网_江汉大学考研信息网-研究生招生报名查询系统...
- C语言 用switch语句实现多分支选择结构
热门文章
- XenApp6 建立请求的连接时出错解决方法
- spring boot configuration annotation processor not found in classpath问题解决
- Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
- saleor的生产环境部署-失败记录
- 台式电源GX450的开关O和-到底什么意思
- 肺癌图片识别的相关信息
- 宽带651以及光猫红色灯闪烁-故障维修
- Running /usr/bin/wineserver -w. This will hang until all wine processes XXXX terminate
- Exception in thread main java.lang.NoSuchMethodError
- ValueError: You are trying to load a weight file containing 12 layers into a model with 2 layers.