1.前言
为了尽可能的与其它链接器兼容,GNU链接器ld涵盖了很多情况。因此,有很多选项可以控制链接器的行为。
2. 命令行选项概述
链接器支持很多命令行选项,在特定的上下文,实际应用中只有很少一部分被使用。举例来说,ld用来链接unix系统的标准的unix对象文件,在这个系统中链接文件hello.o:
ld -o output /lib/crt0.o hello.o -lc
如上告知ld生成output输出文件,它是由/lib/crt0.o hello.c和库libc.a链接而成。libc.a会从一些标准的搜索目录中找到(可以参见下面关于’l’的选项)
ld命令行选项可以出现在命令行的任何地方。尽管如此,与目标文件和其它文件选项相比,引用文件的选项如”l”和”T”,在出现的地方会引起文件被读取。
重复不同的参数的non-file选项不会产生进一步的影响,或许会覆盖前面的效果(出现在命令行左侧的参数)。
多余一个的选项可能是更有意义的,将会在下面进行描述。
non-option参数是对象文件或被链接在一起的文件。他们或者跟在命令行选项后面或者位于命令行选项前面或者与命令行选项混杂在一起,除非对象文件参数可能不会放到选项和参数之间。
通常链接器在至少有一个对象文件时才被调用,但是你可以使用”-l” “-R”或脚本命令语言指定其他形式的二进制输入文件,如果没有指定任何二进制输入文件,链接器不会产生任何输出,会产生消息:“No input files”。
如果链接器不能识别对象文件的格式,它会假定它是一个链接脚本。用这种方式指定的脚本会扩充链接器使用的主链接脚本(默认的链接脚本或-T指定的脚本)。
这个特性使得链接器会去链接一些文件,这些文件看上去像是object或archive,而实际上仅仅包含几个符号定义或使用INPUT或GROUP来去load其它objects.
用这种方式指定一个脚本仅仅是扩充了主链接脚本,而用"-T"选项是替换整个链接脚本,但是要主要对"INSERT"命令的影响法(Chapter 3 [Scripts], page 37.)
对于名字是单个字母的选项,选项参数必须跟在选项字母后面,不需要空格,或者作为一些分开的参数跟在选项后面。
对于有多个字母的选项,字母前面可以由一条或者两条的短线,比如:‘-trace-symbol’ and ‘--trace-symbol’是等价的。
注;由一个例外是如果以o开头的多个字母选项,前面必须有两条短线,这是为了避免与-o选项混淆,比如:‘-omagic’设置输出文件名为 ‘magic’ 而‘--omagic’输出时设置 NMAGIC标记
对于多字母选项必须用"="将选项名分开,或者作为参数直接跟在选项名后面,如:‘--trace-symbol foo’ and ‘--trace-symbol=foo’是等价的。多字母选项的唯一缩写也是可以的
注:如果链接脚本是通过编译器驱动间接调用,则所有的链接器命令行选项必须以'-Wl'为前缀(对有些特定的编译器都是可以的),举例如下:
gcc -Wl,--start-group foo.o bar.o -Wl,--end-group
这是很重要的,否则编译器驱动会悄悄的删除掉这些链接器选项,造成链接错误。
当通过编译器驱动传递的选项需要值的时候,可能引起混乱,因为选项和参数之间的空格扮演一个分隔符,这样编译器驱动只会传递选项给链接器,参数传递给编译器,
这种情况下最简单的处理方法是像下面这样:(单字母选项直接后跟参数,多字母选项用=连接)
gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map