我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《U-Boot重定位代码分析 》, 一起来围观吧 https://blog.csdn.net/huangxb_csu/article/details/4981677?utm_source=app&app_version=5.0.1&code=app_1562916241&uLinkId=usr1mkqgl919blen
我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《重定位和链接》, 一起来围观吧 https://blog.csdn.net/u012741741/article/details/51870752?utm_source=app&app_version=5.0.1&code=app_1562916241&uLinkId=usr1mkqgl919blen
链接脚本其实是个规则文件,他是程序员用来指挥链接器工作的。链接器会参考链接脚本,并且使用其中规定的规则来处理.o文件中那些段,将其链接成一个可执行程序。
链接脚本的关键内容有2部分:段名 + 地址(作为链接地址的内存地址)
链接脚本的理解:
SECTIONS {…} 这个是整个链接脚本
. 点号在链接脚本中代表当前位置。
= 等号代表赋值
程序段的概念:代码段、数据段、bss段(ZI段)、自定义段
段就是程序的一部分,我们把整个程序的所有东西分成了一个一个的段,给每个段起个名字,然后在链接时就可以用这个名字来指示这些段。也就是说给段命名就是为了在链接脚本中用段名来让段站在核实的位置。
段名分为2种:一种是编译器链接器内部定好的,先天性的名字;
一种是程序员自己指定的、自定义的段名。
先天性段名:
代码段:(.text),又叫文本段,代码段其实就是函数编译后生成的东西
数据段:(.data),数据段就是C语言中有显式初始化为非0的全局变量
bss段:(.bss),又叫ZI(zero initial)段,就是零初始化段,对应C语言中初始化为0的全局变量。
后天性段名:
段名由程序员自己定义,段的属性和特征也由程序员自己定义。