GNU LD之二LD script

前言

目前正在从头开发一个MIPS的嵌入式项目,有机会从零开始写ld脚本,于是趁机把GNU LD的官方文档读了一遍。

链接如下:http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html

该文档分为几个章节,为了便于介绍,我在这里也按照文章的阅读顺序,分别把读后感记录在这里。

ld俗称链接器,就是吃进去object files,输出可执行文件。而可执行文件是可以下载到存储器让CPU取指令运行的文件格式。

ld吃下各个object files,并将其消化,最后转换为生命所需的营养(可执行文件),或者shit(错误)。

消化的过程,主要是分析object files里面的符号,例如全局变量,静态变量,函数名等,根据符号的调用关系,以及ld脚本的安排,将符号安排在内存合适的位置。

关于全局变量,静态变量,局部变量,函数,这些分别放在text段,data段,还是堆栈的知识,我就不讲了,有C语言编程经验的人应该都知道,不清楚的可以翻K&R的书。

目标文件在其存储器映像文件中的布局

首先我们来看一本书,《MIPS体系结构透视》,在其9.5小节“目标文件在其存储器映像文件中的布局”中,描述了可执行文件中的各个段是如何在存储器映像中布局的。在这一节中有一张图如下所示,可以显示出各个段在内存的存储器中的布局。所以我们在ld脚本中也要按照这个顺序来定义各个段。

 

至于其中每个段的含义,可以参考这本书的这一节啰。这里挑出一点,就是.sbss,还有.bss这两个的区别,以及.sdata,待续。。。

原文地址:https://www.cnblogs.com/ironx/p/4954845.html