[GNU LD系列 3.1]一些基本的链接脚本概念

我们需要定义一些基本的概念和词汇来描述链接脚本语言。

链接器(linker)将一系列输入文件(input files)组合起来变成一个单一的输出文件(output file)。输出文件和每一个输入文件拥有一样的数据格式,即目标文件格式(object file format)。每一个文件被称作为目标文件(object file)。输出文件通常被称为可执行文件(executable),我们也可以称它们为目标文件。每个目标文件有一个由区(section)组成的列表,及其他一些东西。我们有时把在输入文件中的区称为输入区(input section);在输出文件中的区称为输出区(output section)。

每一个在目标文件中的区有名字(name)和大小(size)。对大多数区来说,都会有一块数据和它们关联,被称为区内容(section contents)。一个区可能被标记成可加载的(loadable),即当输出文件运行的时候区内容会被加载到内存中。一个没有内容的区可能是可分配的(allocatable),即一块内存区域会被划出来,但不会有特定的东西会被加载到那里。如果一个区既不是可加载的,又不是可分配的,那么通常会包含一系列调试信息。

每一个可加载的,或可分配的输出区拥有两个地址。第一个地址是VMA, 即虚拟内存地址(virtual memory address)。当输出文件运行的时候,区会拥有的地址。第二个是LMA, 即加载内容地址(load memory address)。这是区会被加载到的地址。在绝大多数情况下这两个地址应该是一样的。它们会不一样的一个可能的例子是,一个数据区(data section)被加载进ROM,然后当程序运行时会被拷贝到RAM。在这种例子里,ROM中的地址就是LMA,在内存中的地址就是VMA。

我们可以用objdump工具附加`-h`参数来观察一个目标文件的区信息。

每个目标文件也各自有一个符号(symbol)列表,被称为符号表(symbol table)。一个符号可以被定义,也可以不被定义。每一个符号都有一个名字,每个已经定义的符号还有一个地址和其他一些信息。如果我们把C/C++程序编译成一个目标文件,那么里面每一个已经定义的函数、全局变量、静态变量都会对应一个符号。每一个在输入文件中未定义的函数、全局变量会变成未定义符号。

想观察目标文件中的符号表,可以使用nm工具,或使用objdump工具附带`-t`参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值