使用LD,GNU 链接器说明(1)
0.前言
在学习嵌入式的过程中发现链接文件是一个非常重要的文件,关系到程序的组织以及最终生产的代码。本文参考一篇英文文档,原文链接为:
http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html
本文并非逐句翻译,可能会有删减。
1.概览
ld用于链接一些目标文件和归档文件,重定位他们的数据和绑定符号引用。通常情况下编译的最后一个步骤就是运行ld。
ld的链接命令是以ATT链接编辑命令语法的超集,对整个链接过程提供显示的和完整的控制。
这个版本的ld使用通用的BSD库来运行目标文件。它运行ld去读取、联合和写多种格式的目标文件,比如COFF文件或者a.out文件。不同格式的文件可以链接在一起以产生任何可用类型的目标文件。
除了灵活性以外,GNU连接器在提供诊断信息方面比其他连接器更有帮助。许多连接器在遇到错误时会立即放弃执行。而ld只要有可能,就会继续执行,允许你去识别其他错误(或者在一些情况下,尽管有错误也能输出目标文件)。
2.调用
GNU链接器旨在覆盖多种情况,并且尽可能的与其他连接器保持兼容,因此,你有多种选择可以来控制它的行为。
3.命令行选项
链接器支持大量的命令行选项,但在实际应用中,有一部分很少在实际应用中使用。例如,一个经常使用ld的情况为在一个标准的,支持unix的系统上连接一个标准的unix目标文件。在这样的一个系统中,链接一个文件hello.o:
ld -o output /lib/crt0.o hello.o -lc
上面的命令告诉连接器生成一个叫output的文件,作为crt0.o和hello.o以及libc.a的连接结果,libc.a为来自于一个标准的搜索目录。(具体参阅下文的“-l”选项)。
ld的命令行可以以任意的顺序指定,并且可以随意重复。重复使用不同参数的大多数选项将不会产生进一步的影响,或者覆盖之前该选项出现的位置(在命令行的左侧)。
非选项参数是要被连接的目标文件。他们可以跟随、先于或者混入命令行选项,除了不可以在一个参数选项和它的参数之间放置。
通常连接器要调用至少一个目标文件,你也可以使用-l、-R和脚本命令语言指定其他格式的二进制输入文件。如果没有指定二进制输入文件,那么连接器不会产生任何输出,并输出消息“无输入文件”
如果连接器无法识别目标文件的格式,则会认为它是连接器脚本。以这种方式指定的脚本会增加用于连接的主连接器脚本(要么使用默认的连接器脚本,要么使用“-T”指定的脚本)。此功能运行连接器连接到一个文件,该文件看起来像是一个对象或者归档文件,但实际上仅仅是定义了一些符号值,或者使用INPUT或者GROUP去加载其他对象。请注意,以这种方式指定脚本只能用于扩充主连接器脚本;如果你想使用一些逻辑上只能出现一次的命令,如SECTIONS或者MEMORY命令,则必须使用“-T”来替换默认链接脚本。具体请参阅命令语言章节。
对于名称为单个字母的选项,选项参数必须紧跟选项字母,中间不能使用空格,或者作为一个单独的参数立即提供。
对于名称为多个字母的选项,可以在选项名称前加上一个或者两个“-”,多字母选项的参数必须通过等号与选项名称分开,或则在需要它们的选项之后立即作为单独的参数提供。例如“--oformat srec”和“--oformat = srec”是等价的。多字母选项名称的唯一缩写是可以接受的。
待续
选项参数较多,另起一篇文章,待续。。。。。。