ld [ options ] objfile ...
ld结合了许多对象和归档文件,重新定位其数据并绑定符号引用。通常,编译程序的最后一步是运行ld。
ld接受以AT&T的链接编辑器命令语言语法的超集编写的链接器命令语言文件,以提供对链接过程的显式和完全控制。
该手册页未描述命令语言; 有关命令语言和GNU链接器其他方面的完整详细信息,请参阅“info”中的ld条目。
此版本的ld使用通用BFD库来操作目标文件。这允许ld以多种不同的格式读取,组合和写入目标文件 - 例如,COFF或“a.out”。可以将不同的格式链接在一起以产生任何可用类型的目标文件。
除了灵活性之外,GNU链接器在提供诊断信息方面比其他链接器更有帮助。许多链接器在遇到错误时立即放弃执行; 只要有可能,ld继续执行,允许您识别其他错误(或者,在某些情况下,尽管出现错误,仍然可以获取输出文件)。
的GNU接头LD意在覆盖宽范围的情况,并且是作为兼容尽可能与其它接头。
链接器支持大量的命令行选项,但在实际操作中,很少有它们可用于任何特定的上下文。例如,经常使用ld是在标准的受支持Unix系统上链接标准Unix目标文件。在这样的系统上,要链接文件“hello.o”:
ld -o
这告诉ld生成一个名为output的文件,作为链接文件“/lib/crt0.o”和“hello.o”以及库 “libc.a”的结果,它将来自标准搜索目录。(请参阅下面的-l选项的讨论。)
可以在命令行中的任何位置指定ld的某些命令行选项。但是,引用文件的选项(如-l或 -T)会导致在命令行中出现选项的位置读取文件,相对于目标文件和其他文件选项。使用不同的参数重复非文件选项将不会产生进一步的影响,或者覆盖该选项的先前出现(在命令行的左侧)。可能有意义地指定多次的选项在下面的描述中说明。
非选项参数是要链接在一起的目标文件或存档。除了在选项及其参数之间不能放置对象文件参数之外,它们可以跟随,先于或混合使用命令行选项。
通常使用至少一个目标文件调用链接器,但您可以使用-l,-R和脚本命令语言指定其他形式的二进制输入文件。如果未指定任何二进制输入文件,则链接器不会生成任何输出,并发出消息No input files。
如果链接器无法识别目标文件的格式,则会假定它是链接描述文件。以这种方式指定的脚本会扩充用于链接的主链接器脚本(默认链接描述文件或使用-T指定的脚本)。此功能允许链接器链接到看似是对象或存档的文件,但实际上只定义了一些符号值,或使用“INPUT”或“GROUP”来加载其他对象。以这种方式指定脚本只会增加主链接器脚本,并在主脚本之后放置额外的命令; 使用-T选项完全替换默认链接描述文件,但请注意“INSERT”命令的效果。
对于名称为单个字母的选项,选项参数必须遵循选项字母而不插入空格,或者在紧跟需要它们的选项后立即作为单独的参数给出。
对于名称为多个字母的选项,选项名称前面可以有一个或两个短划线; 例如,-trace-symbol和 --trace-symbol是等价的。注意---这条规则有一个例外。以小写字母“o”开头的多个字母选项只能以两个破折号开头。这是为了减少与-o选项的混淆。因此,例如-omagic将输出文件名设置为magic,而 --magic在输出上设置NMAGIC标志。
多字母选项的参数必须通过等号与选项名称分隔,或者在紧跟需要它们的选项后作为单独的参数给出。例如, - trace-symbol foo和--trace-symbol = foo是等价的。可接受多个字母选项名称的唯一缩写。
注意---如果通过编译器驱动程序(例如gcc)间接调用链接器,则所有链接器命令行选项都应该以-Wl为前缀 (或者适用于特定编译器驱动程序的任何内容),如下所示:
gcc -Wl, - start-group foo.o bar.o -Wl, - end-group
这很重要,因为否则编译器驱动程序可能会静默删除链接器选项,从而导致链接错误。当通过驱动程序传递需要值的选项时,也可能出现混淆,因为选项和参数之间的空格的使用充当分隔符,并导致驱动程序仅将选项传递给链接器并将参数传递给编译器。在这种情况下,最简单的方法是使用单字母和多字母选项的连接形式,例如:
gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map = a.map
以下是GNU链接器接受的通用命令行开关的表:
@ 文件
从文件中读取命令行选项。插入的选项将替换原始的@ file选项。如果文件不存在或无法读取,则该选项将按字面处理,而不是删除。
文件中的选项由空格分隔。通过用单引号或双引号括起整个选项,可以在选项中包含空白字符。可以通过在字符前加上反斜杠来包含任何字符(包括反斜杠)。该文件本身可能包含其他@ 文件选项; 任何此类选项将以递归方式处理。
-a keyword
HP / UX兼容性支持此选项。该关键字的参数必须是字符串中的一个存档(archive),共享(shared),或 默认(default)。-aarchive在功能上等同于-Bstatic,而其他两个关键字在功能上等同于-Bdynamic。此选项可以使用任意次。
--audit AUDITLIB
将AUDITLIB添加到动态部分的“DT_AUDIT”条目。不检查AUDITLIB是否存在,也不会使用库中指定的DT_SONAME。如果多次指定,“DT_AUDIT”将包含要使用的冒号分隔的审计接口列表。如果链接器在搜索共享库时找到带有审计条目的对象,它将在输出文件中添加相应的 “DT_DEPAUDIT”条目。此选项仅在支持rtld-audit接口的ELF平台上有意义。
-A architecture
--architecture=architecture
在当前版本的ld中,此选项仅适用于Intel 960系列架构。在该ld配置中, 体系结构参数标识960系列中的特定体系结构,启用一些安全措施并修改存档库搜索路径。
ld的未来版本可能支持其他架构系列的类似功能。
-b input-format
--format=input-format
ld可以配置为支持多种目标文件。如果以这种方式配置ld,则可以使用-b选项在命令行上为此选项指定输入对象文件的二进制格式。即使ld配置为支持备用对象格式,您通常也不需要指定它,因为ld应该配置为期望默认输入格式是每台机器上最常用的格式。 input-format是一个文本字符串,是BFD库支持的特定格式的名称。(您可以使用objdump -i列出可用的二进制格式。)
如果要使用不常见的二进制格式链接文件,则可能需要使用此选项。您还可以使用-b显式切换格式(链接不同格式的目标文件时),方法是在特定格式的每组目标文件之前包含-b input- format。
默认格式取自环境变量“GNUTARGET”。
您还可以使用命令“TARGET”从脚本定义输入格式;
-c MRI-commandfile
--mri-script = MRI-commandfile
为了与MRI生成的链接器兼容,ld接受以备用,受限制的命令语言编写的脚本文件,如GNU ld文档的MRI Compatible Script Files部分所述。使用选项-c介绍MRI脚本文件; 使用-T选项运行以通用ld脚本语言编写的链接描述文件。如果MRI-cmdfile不存在,ld会在任何-L选项指定的目录中查找它。
-d
-dc
-dp
这三个选项是等价的; 支持多种形式以与其他链接器兼容。即使指定了可重定位的输出文件(使用-r),它们也会将空间分配给公共符号。脚本命令“FORCE_COMMON_ALLOCATION”具有相同的效果。
--depaudit AUDITLIB
-P AUDITLIB
将AUDITLIB添加到动态部分的“DT_DEPAUDIT”条目。不检查AUDITLIB是否存在,也不会使用库中指定的DT_SONAME。如果指定多次“DT_DEPAUDIT”将包含要使用的冒号分隔的审计接口列表。此选项仅在支持rtld-audit接口的ELF平台上有意义。-P选项用于Solaris兼容性。
-e entry
--entry=entry
使用entry作为开始执行程序的显式符号,而不是默认入口点。如果没有名为entry的符号 ,链接器将尝试将条目解析为数字,并将其用作条目地址(该数字将在基数10中解释;您可以使用前导0x作为基数16,或者前导0对于基地8)。
--exclude-libs lib ,lib ,...
指定不应自动导出符号的归档库列表。库名可以用逗号或冒号分隔。指定“--exclude-libs ALL”会从自动导出中排除所有归档库中的符号。此选项仅适用于链接器的i386 PE目标端口和ELF目标端口。对于i386 PE,无论此选项如何,仍会导出.def文件中明确列出的符号。对于ELF目标端口,受此选项影响的符号将被视为隐藏。
--exclude-modules-for-implib module,module,...
指定目标文件或归档成员的列表,不应自动导出符号,但应将其批量复制到链接期间生成的导入库中。模块名称可以用逗号或冒号分隔,并且必须与ld 用于打开文件的文件名完全匹配; 对于归档成员,这只是成员名称,但对于目标文件,列出的名称必须包含并精确匹配用于在链接器命令行上指定输入文件的任何路径。此选项仅适用于链接器的i386 PE目标端口。无论此选项如何,仍会导出.def文件中明确列出的符号。
-E
--export动态
--no出口动态
创建动态链接的可执行文件时,使用-E选项或--export-dynamic选项会使链接器将所有符号添加到动态符号表中。动态符号表是在运行时从动态对象可见的符号集。
如果不使用这些选项中的任何一个(或使用--no-export-dynamic选项恢复默认行为),则动态符号表通常仅包含链接中提到的某个动态对象引用的那些符号。
如果使用“dlopen”加载需要引用程序定义的符号的动态对象,而不是某些其他动态对象,则在链接程序本身时可能需要使用此选项。
如果输出格式支持,您还可以使用动态列表来控制应将哪些符号添加到动态符号表中。请参阅--dynamic-list的说明。
请注意,此选项特定于ELF目标端口。PE目标支持类似的功能,以从DLL或EXE导出所有符号 ; 请参阅下面的--export-all-symbols的说明。
-EB
链接大端对象。这会影响默认输出格式。
-EL
链接little-endian对象。这会影响默认输出格式。
-F name
--filter=name
创建ELF共享对象时,将内部DT_AUXILIARY字段设置为指定的名称。这告诉动态链接器共享对象的符号表应该用作共享对象名称的符号表上的辅助过滤器。
如果稍后将程序与此过滤器对象链接,则在运行程序时,动态链接器将看到DT_AUXILIARY字段。如果动态链接器解析过滤器对象中的任何符号,它将首先检查共享对象名称中是否存在定义。如果有,则将使用它而不是过滤器对象中的定义。共享对象名称不需要存在。因此,共享对象名称可用于提供某些功能的替代实现,可能用于调试或用于机器特定性能。
可以多次指定此选项。该DT_AUXILIARY条目将在它们出现在命令行上的顺序来创建。
-fini=name
创建ELF可执行文件或共享对象时,通过将DT_FINI设置为函数的地址,在卸载可执行文件或共享对象时 调用NAME。默认情况下,链接器使用“_fini”作为要调用的函数。
-g
忽略。提供与其他工具的兼容性。
-G value
--gpsize = value
使用GP寄存器设置要优化的对象的最大大小。这仅对目标文件格式有意义,例如 MIPS ECOFF,它支持将大型和小型对象放入不同的部分。对于其他目标文件格式,将忽略此项。
-h name
-soname=name
创建ELF共享对象时,将内部DT_SONAME字段设置为指定的名称。当可执行文件与具有DT_SONAME字段的共享对象链接时,则在运行可执行文件时,动态链接器将尝试加载由DT_SONAME字段指定的共享对象,而不是使用为链接器指定的文件名。
-i
执行增量链接(与选项-r相同)。
-init = name
创建ELF可执行文件或共享对象时,通过将DT_INIT设置为函数的地址,在加载可执行文件或共享对象时 调用NAME。默认情况下,链接器使用“_init”作为要调用的函数。
-l namespec
--library = namespec
将namespec指定的存档或目标文件添加到要链接的文件列表中。此选项可以使用任意次。如果namespec的格式为:filename,ld将在库路径中搜索名为filename的文件,否则它将在库路径中搜索名为libnamespec.a的文件。
在支持共享库的系统上,ld也可以搜索libnamespec.a以外的文件。具体来说,在ELF和SunOS系统,劳工处将搜索的目录中一个名为库libnamespec.so寻找一个叫前libnamespec.a。(按照惯例,“。so”扩展名表示共享库。)请注意,此行为不适用于:filename,它始终指定名为filename的文件。
链接器将仅在命令行上指定的位置搜索一次存档。如果存档定义了在命令行上存档之前出现的某个对象中未定义的符号,则链接器将包含存档中的相应文件。但是,稍后在命令行中出现的对象中的未定义符号将不会导致链接器再次搜索存档。
请参阅- (用于强制链接器多次搜索存档的方法的选项)。
您可以在命令行上多次列出相同的存档。
这种类型的归档搜索是Unix链接器的标准。但是,如果您在AIX上使用ld,请注意它与AIX链接器的行为不同。
-L searchdir
--library-path = searchdir
将路径searchdir添加到ld将搜索归档库和ld控制脚本的路径列表中。您可以多次使用此选项。将按照在命令行中指定目录的顺序搜索目录。在默认目录之前搜索命令行中指定的目录。无论选项出现的顺序如何,所有-L选项都适用于所有-l选项。除非指定-T选项,否则-L 选项不会影响ld搜索链接描述文件的方式。
如果searchdir以“=”开头,则“=”将替换为sysroot前缀,即配置链接器时指定的路径。
搜索的默认路径集(未指定-L)取决于ld使用的仿真模式,在某些情况下还取决于其配置方式。
也可以使用“SEARCH_DIR”命令在链接脚本中指定路径。在链接描述文件出现在命令行中的位置搜索以这种方式指定的目录。
-m emulation
-m 仿真
模拟仿真链接器。您可以使用--verbose或-V选项列出可用的仿真。
如果未使用-m选项,则仿真将从“LDEMULATION”环境变量中获取(如果已定义)。
否则,默认仿真取决于链接器的配置方式。
-M
--print-map
打印到标准输出的链接映射。链接映射提供有关链接的信息,包括以下内容:
- 目标文件映射到内存的位置。
“如何分配常见符号。
“链接中包含所有归档成员,并提及导致归档成员被引入的符号。
分配给符号的值。
注 - 其值由表达式计算的符号可能不会在链接映射中显示正确的结果,该表达式涉及对同一符号的先前值的引用。这是因为链接器会丢弃中间结果,并且只保留表达式的最终值。在这种情况下,链接器将显示方括号括起来的最终值。例如,链接器脚本包含:
foo = 1
foo = foo * 4
foo = foo + 8
foo = foo * 4
foo = foo + 8
如果使用-M选项,将在链接映射中生成以下输出:
0x00000001 foo = 0x1
[0x0000000c] foo =(foo * 0x4)
[0x0000000c] foo =(foo + 0x8)
[0x0000000c] foo =(foo * 0x4)
[0x0000000c] foo =(foo + 0x8)
有关链接描述文件中表达式的更多信息, 请参见表达式
-n
--nmagic
关闭部分的页面对齐,如果可能,将输出标记为“NMAGIC”。