Linux / Unix命令:Id

名称

ld - 使用LDGNU链接器

概要

ld [ options ] objfile ...

描述

ld结合了许多对象和归档文件 ,重新定位了它们的数据并绑定了符号引用。 通常编译程序的最后一步是运行ld

ld接受以AT&T的链接编辑器命令语言语法超集编写的链接器命令语言文件,以提供对链接过程的显式和完全控制。

这个手册页没有描述命令语言; 请参阅“info”中的ld条目或手册ld: GNU链接器,了解有关命令语言和GNU链接器其他方面的完整详细信息。

该版本的ld使用通用BFD库来操作对象文件。 这允许ld读取,合并和写入许多不同格式的目标文件---例如COFF或“a.out”。 不同的格式可以链接在一起以产生任何可用类型的目标文件。

除了灵活性之外,GNU链接器在提供诊断信息方面比其他链接器更有帮助。 许多连接器在遇到错误时立即放弃执行。 只要有可能, ld会继续执行,允许您识别其他错误(或者,在某些情况下,尽管出现错误,仍然可以获取输出文件)。

GNU 链接器ld旨在涵盖各种各样的情况,并尽可能与其他链接器兼容。 因此,您有很多选择来控制其行为。

OPTIONS

链接器支持大量的 命令行选项 ,但在实际操作中很少使用任何特定的上下文。 例如,经常使用ld就是在标准的,受支持的Unix系统上链接标准的Unix对象文件。 在这样的系统上,要链接一个文件“hello.o”:

ld -o /lib/crt0.o hello.o -lc

这告诉ld通过将文件“/lib/crt0.o”与“hello.o”和库“libc.a”链接起来,生成一个名为output的文件,该文件将来自标准搜索目录。 (请参阅下面的-l选项的讨论。)

一些命令行选项可以在命令行中的任意位置指定。 但是,引用文件(例如-l-T )的选项会导致在选项出现在命令行中的位置(相对于目标文件和其他文件选项)读取文件。 使用不同参数重复非文件选项将不会产生进一步的效果,或者覆盖该选项的先前出现次数(命令行左侧的出现次数)。 在下面的描述中注明了可能多次被有意义指定的选项。

非选项参数是要链接在一起的对象文件或档案。 它们可以跟随,先于或混入命令行选项,除了可以不在选项和其参数之间放置目标文件参数。

通常链接器至少要调用一个目标文件,但可以使用-l-R和脚本命令语言指定其他形式的二进制输入文件。 如果没有指定二进制输入文件,则链接器不会生成任何输出,并发出消息“ 无输入文件”

如果链接器无法识别目标文件的格式,则会假定它是链接器脚本。 以这种方式指定的脚本将扩充用于链接的主链接器脚本(默认链接器脚本或使用-T指定的脚本)。 这个特性允许链接器链接到一个文件,该文件看起来像是一个对象或存档,但实际上只是定义了一些符号值,或者使用“INPUT”或“GROUP”加载其他对象。 请注意,以这种方式指定脚本只会增加主链接器脚本; 使用-T选项完全替换默认链接器脚本。

对于名称为单个字母的选项,选项参数必须跟随选项字母而不介入空格,或者在需要它们的选项后立即作为单独的参数提供。

对于名称为多个字母的选项,可以在选项名称前加上一个或两个短划线; 例如, -trace-symbol-trace -symbol是等价的。 请注意 - 此规则有一个例外。 以小写字母“o”开头的多字母选项只能以两个破折号开头。 这是为了减少与-o选项的混淆。 因此,例如-omagic将输出文件名设置为magic,--omagic设置输出上的NMAGIC标志。

多字母选项的参数必须通过等号与选项名称分开,或者在需要它们的选项之后立即作为单独的参数提供。 例如,-- trace-symbol foo--trace-symbol = foo是等效的。 可接受多字母选项名称的唯一缩写。

注意 - 如果通过编译器驱动程序(例如gcc )间接调用链接程序,则所有链接程序命令行选项都应该以-Wl (或适用于特定编译器驱动程序的任何内容)作为前缀:

gcc -Wl, - startgroup foo.o bar.o -Wl, - endgroup

这很重要,因为否则编译器驱动程序可能会默默删除链接器选项,导致链接不良。

以下是GNU链接器接受的通用命令行开关的表格:

- 一个 关键字

HP / UX兼容性支持此选项。 关键字参数必须是存档共享默认 字符串之一。 -archive在功能上等同于-Bstatic ,另外两个关键字在功能上等同于-Bdynamic 。 此选项可以使用任意次数。

- 架构

- 架构 = 架构

在当前的ld版本中,该选项仅适用于Intel 960系列架构。 在该ld配置中, 体系结构参数标识了960系列中的特定体系结构,实现了一些安全措施并修改了归档库搜索路径。

ld的未来版本可能支持其他体系结构系列的类似功能。

-b 输入格式

--format = 输入格式

ld可能被配置为支持多种类型的目标文件。 如果以这种方式配置了ld,则可以使用-b选项为命令行上此选项后面的输入对象文件指定二进制格式。 即使将ld配置为支持替代对象格式,通常也不需要指定该格式,因为应将ld配置为在每台计算机上将默认输入格式视为最常见的格式。 input-format是一个文本字符串,它是BFD库支持的特定格式的名称。 (您可以使用objdump -i列出可用的二进制格式。)

如果您使用不常见的二进制格式链接文件,则可能需要使用此选项。 您还可以使用-b显式切换格式(链接不同格式的目标文件时),方法是在每组特定格式的每个目标文件之前包含-b 输入格式。

默认格式取自环境变量“GNUTARGET”。

您还可以使用命令“TARGET”从脚本中定义输入格式;

-c MRI-命令文件

--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”具有相同的效果。

-e 条目

--entry = 条目

使用条目作为开始执行程序的显式符号,而不是缺省入口点。 如果没有符号名称条目 ,链接器将尝试将条目解析为一个数字,并将其用作条目地址(数字将以10为底数解释;您可以使用基数16的前导0x或前导0对于基地8)。

-E

--export动态

创建动态链接的可执行文件时,将所有符号添加到动态符号表中。 动态符号表是在运行时从动态对象可见的一组符号。

如果您不使用此选项,则动态符号表通常只包含由链接中提及的某个动态对象引用的那些符号。

如果使用“dlopen”加载一个需要返回到程序定义的符号而不是其他动态对象的动态对象,那么在链接程序本身时可能需要使用此选项。

如果输出格式支持,您还可以使用版本脚本来控制应将哪些符号添加到动态符号表中。 请参阅@ ref {VERSION}中的--version-script的描述。

-EB

链接大端对象。 这会影响默认的输出格式。

-EL

链接小端对象。 这会影响默认的输出格式。

-F

- 辅助 名称

创建ELF共享对象时,请将内部DT_AUXILIARY字段设置为指定的名称。 这告诉动态链接器,共享对象的符号表应该用作共享对象符号表上的辅助过滤器。

如果稍后将一个程序与此过滤器对象链接,那么当您运行该程序时,动态链接程序将看到DT_AUXILIARY字段。 如果动态链接器解析过滤器对象中的任何符号,它将首先检查共享对象名称中是否存在定义。 如果有,它将被用来代替过滤器对象中的定义。 共享对象名称不必存在。 因此,共享对象名称可用于提供特定功能的替代实现,可能用于调试或针对机器特定的性能。

该选项可能会多次指定。 DT_AUXILIARY条目将按照它们在命令行上出现的顺序创建。

-F 名称

- 过滤器 名称

创建ELF共享对象时,将内部DT_FILTER字段设置为指定的名称。 这告诉动态链接器,正在创建的共享对象的符号表应该用作共享对象名称的符号表上的过滤器。

如果稍后将一个程序与此过滤器对象链接,那么当您运行程序时,动态链接器将看到DT_FILTER字段。 动态链接器将像往常一样根据过滤器对象的符号表来解析符号,但它实际上会链接到在共享对象名称中找到的定义。 因此,可以使用过滤器对象来选择由对象名称提供的符号的子集。

一些较老的连接器在整个编译工具链中使用-F选项来为输入和输出对象文件指定对象文件格式。 GNU链接器为此使用其他机制: -b ,-- format ,-- oformat选项,链接器脚本中的“TARGET”命令以及“GNUTARGET”环境变量。 当不创建ELF共享对象时,GNU链接器将忽略-F选项。

-fini的 名字

创建ELF可执行文件或共享对象时,通过将DT_FINI设置为该函数的地址,在卸载可执行文件或共享对象时调用NAME。 默认情况下,链接器使用“_fini”作为调用的函数。

-G

忽略。 提供与其他工具的兼容性。

-G

--gpsize =

使用GP寄存器设置要优化的对象的最大大小 。 这只对目标文件格式有意义,例如MIPS ECOFF支持将大对象和小对象放入不同的部分。 对于其他目标文件格式,这被忽略。

-h 名称

-soname = 名称

创建ELF共享对象时,请将内部DT_SONAME字段设置为指定的名称。 当一个可执行文件与一个具有DT_SONAME字段的共享对象链接时,那么当可执行文件运行时,动态链接器将尝试加载由DT_SONAME字段指定的共享对象,而不是使用给予链接器的文件名称。

-一世

执行增量链接(与选项-r相同)。

-init 名称

创建ELF可执行文件或共享对象时,通过将DT_INIT设置为该函数的地址,在加载可执行文件或共享对象时调用NAME。 默认情况下,链接器使用“_init”作为函数来调用。

-l 档案

--library = 档案

存档文件 存档添加到要链接的文件列表。 此选项可以使用任意次数。 ld会为每个指定的压缩文件在其路径列表中搜索“libarchive.a”的出现次数。

在支持共享库的系统上, ld也可以搜索扩展名为“.a”以外的库。 具体而言,在ELF和SunOS系统上, ld将搜索扩展名为“.so”的库的目录,然后搜索扩展名为“.a”的库。 按照惯例,“.so”扩展名表示共享库。

链接器只会在命令行指定的位置搜索一次存档。 如果归档文件定义了一个符号,该符号在命令行上归档之前出现的某个对象中未定义,则链接器将从归档文件中包含相应的文件。 但是,稍后在命令行中出现的对象中的未定义符号将不会导致链接器再次搜索存档。

请参阅- (用于强制链接器多次搜索存档的方式的选项。

您可以在命令行上多次列出相同的存档。

这种归档搜索类型是Unix连接器的标准。 但是,如果您使用ld onAIX,请注意它与AIX链接器的行为不同。

-L searchdir

--library-path = searchdir

将路径searchdir添加到ld将搜索归档库和ld控制脚本的路径列表中。 您可以多次使用此选项。 这些目录按照它们在命令行中指定的顺序进行搜索。 在默认目录之前搜索命令行上指定的目录。 无论选项出现的顺序如何,所有-L选项都适用于所有-l选项。

如果searchdir以“=”开头,则“=”将替换为sysroot前缀 ,即链接器配置时指定的路径。

搜索到的默认路径集(不用-L指定)取决于哪个仿真模式ld正在使用,在某些情况下还取决于配置方式。

路径也可以通过“SEARCH_DIR”命令在链接脚本中指定。 在链接器脚本出现在命令行中的位置搜索以此方式指定的目录。

-m 仿真

模拟仿真链接器。 您可以使用--verbose-V选项列出可用的模拟。

如果未使用-m选项,则仿真将取自“LDEMULATION”环境变量(如果已定义)。

否则,默认模拟取决于连接器的配置方式。

-M

--print地图

打印一个链接地图到标准输出。 链接地图提供有关链接的信息,包括以下内容:

*

目标文件和符号被映射到内存中。

*

常用符号如何分配。

*

所有归档成员都包含在链接中,并提及导致归档成员被引入的符号。

-n

--nmagic

关闭部分的页面对齐,并尽可能将输出标记为“NMAGIC”。

-N

--omagic

将文本和数据部分设置为可读写。 另外,不要页对齐数据段,并禁用链接到共享库。 如果输出格式支持Unix样式幻数,请将输出标记为“OMAGIC”。

--no-OMAGIC

这个选项抵消了-N选项的大部分影响。 它将文本部分设置为只读,并强制数据段进行页面对齐。 注意 - 该选项不支持链接到共享库。 为此使用-Bdynamic

-o 输出

--output = 输出

使用输出作为由ld生成的程序的名称; 如果未指定此选项,则默认使用名称a.out 。 脚本命令“OUTPUT”也可以指定输出文件的名称。

-O 级别

如果level是一个大于零的数值, ld会优化输出。 这可能需要更长的时间,因此可能应该只对最终的二进制文件启用。

-q

--emit-relocs

将重定位部分和内容留在完全链接的可执行文件中。 后链接分析和优化工具可能需要此信息才能对可执行文件执行正确的修改。 这导致更大的可执行文件。

此选项目前仅在ELF平台上受支持。

-r

--relocateable

生成可重定位的输出---即生成一个输出文件,该文件又可以作为ld的输入。 这通常称为部分链接 。 作为副作用,在支持标准Unix幻数的环境中,该选项还将输出文件的幻数设置为“OMAGIC”。 如果未指定此选项,则生成绝对文件。 链接C ++程序时,该选项不会解析对构造函数的引用; 要做到这一点,请使用-Ur

如果输入文件的格式与输出文件不相同,则仅当输入文件不包含任何重定位时才支持部分链接。 不同的输出格式可能会有更多限制; 例如一些基于“a.out”的格式不支持与其他格式的输入文件进行部分链接。

这个选项和-i一样

-R 文件名

--just-symbols = 文件名

文件名读取符号名称及其地址,但不要重定位或将其包含在输出中。 这允许您的输出文件象征性地引用其他程序中定义的绝对内存位置。 您可以多次使用此选项。

为了与其他ELF链接器兼容,如果-R选项后面跟有目录名称,而不是文件名,则将其视为-rpath选项。

-s

--strip-ALL

省略输出文件中的所有符号信息。

-S

--strip调试

忽略输出文件中的调试器符号信息(但不是全部符号)。

-t

- 跟踪

将输入文件的名称作为ld处理它们。

-T 脚本文件

--script = scriptfile

使用scriptfile作为链接器脚本。 该脚本替换了ld的默认链接器脚本(而不是添加到它),因此commandfile必须指定描述输出文件所需的所有内容。 如果scriptfile在当前目录中不存在,“ld”会在任何前面的-L选项指定的目录中查找它。 多个-T选项累积。

-u 符号

--undefined = 符号

将强制符号作为未定义符号输入到输出文件中。 例如,这可能会触发从标准库中链接附加模块。 -u可以用不同的选项参数重复输入其他未定义的符号。 该选项等同于“EXTERN”链接描述文件命令。

-ur

对于除C ++程序以外的其他任何内容,此选项等同于-r :它会生成可重定位的输出---即输出文件,该输出文件又可用作ld的输入。 在链接C ++程序时, -Ur 确实解析了对构造函数的引用,与-r不同。 它不适用于-Ur文件,这些文件本身与-Ur链接; 一旦构造函数表被构建,它就不能被添加到。 使用-Ur仅用于最后一个部分链接, -r用于其他部分链接。

--unique [= SECTION ]

为每个匹配SECTION的输入节创建一个单独的输出 ,或者如果缺少可选的通配符SECTION参数,则为每个孤立输入节创建一个单独的输出节。 孤儿部分是链接器脚本中未特别提到的部分。 您可以在命令行上多次使用此选项; 它可以防止具有相同名称的输入节的正常合并,覆盖链接器脚本中的输出节分配。

-v

- 版

-V

显示ld的版本号。 -V选项还列出了支持的仿真。

-X

--discard,所有

删除所有本地符号。

-X

--discard本地人

删除所有临时的本地符号。 对于大多数目标来说,这是所有以L开头的本地符号。

-y 符号

--trace-symbol = 符号

打印出现符号的每个链接文件的名称。 这个选项可以被赋予任意次数。 在许多系统上,需要预先加下划线。

如果链接中有未定义的符号,但不知道引用来自何处,则此选项非常有用。

-Y 路径

路径添加到默认库搜索路径。 该选项存在于Solaris兼容性中。

-z 关键字

公认的关键词是“initfirst”,“interpose”,“loadfltr”,“nodefaultlib”,“nodelete”,“nodlopen”,“nodump”,“now”,“origin”,“combreloc”,“nocombreloc”和“nocopyreloc ”。 对于Solaris兼容性,其他关键字将被忽略。 “initfirst”标记要在运行时首先在任何其他对象之前初始化的对象。 “interpose”标记其符号表在所有符号之前插入的对象,而不是主要可执行文件。“loadfltr”标记其对象在运行时立即被处理。“nodefaultlib”标记该对象的依赖关系搜索将忽略的对象任何默认库搜索路径。 “nodelete”标志着对象不应该在运行时被卸载。 “nodlopen”标记不可用于“dlopen”的对象。 “nodump”标记的对象不能被“dldump”倾倒。 “now”用非延迟运行时绑定标记对象,“origin”标记对象可能包含$ ORIGIN。 “defs”不允许未定义的符号。“muldefs”允许多个定义。 “combreloc”结合了多个reloc节并对它们进行排序,从而使动态符号查找缓存成为可能。

“nocombreloc”禁用多个reloc节组合。 “nocopyreloc”会禁用复制重定位的生成。

- ( 档案 - )

--start-group 档案 --end-group

档案应该是档案文件的列表。 它们可能是显式文件名或-l选项。

重复搜索指定的档案,直到没有创建新的未定义参考。 通常情况下,档案只会在命令行中指定的顺序搜索一次。 如果需要该归档中的符号来解析在命令行中稍后出现的归档中由对象引用的未定义符号,则链接程序将无法解析该引用。 通过对档案进行分组,他们都被重复搜索,直到解决所有可能的参考。

使用此选项会产生显着的性能成本。 只有在两个或多个档案之间存在不可避免的循环引用时才最好使用它。

--accept未知输入拱

--no-接受未知输入拱

告诉链接器接受其体系结构无法识别的输入文件。 假设是用户知道他们在做什么并故意要链接这些未知的输入文件。 这是链接器在版本2.14之前的默认行为。 从版本2.14开始的默认行为是拒绝这些输入文件,因此添加了--accept-unknown-input-arch选项来恢复旧行为。

-assert 关键字

SunOS兼容性忽略此选项。

-Bdynamic

-dy

-call_shared

链接到动态库。 这仅在支持共享库的平台上才有意义。 此选项通常是此类平台上的默认选项。 这个选项的不同变体是为了与各种系统兼容。 您可以在命令行上多次使用此选项:它会影响库搜索其后的-l选项。

-Bgroup

在动态部分的“DT_FLAGS_1”条目中设置“DF_1_GROUP”标志。 这会导致运行时链接程序处理此对象中的查找以及仅在组内执行的依赖关系。 - 不确定是隐含的。 该选项仅对支持共享库的 ELF平台有意义。

-Bstatic

-dn

-non_shared

-静态的

不要链接到共享库。 这仅在支持共享库的平台上才有意义。 这个选项的不同变体是为了与各种系统兼容。 您可以在命令行上多次使用此选项:它会影响库搜索其后的-l选项。

-Bsymbolic

创建共享库时,将引用全局符号绑定到共享库中的定义(如果有)。 通常,链接到共享库的程序可能会覆盖共享库中的定义。 该选项仅对支持共享库的ELF平台有意义。

--check截面

--no检查截面

要求链接程序在分配它们之后不要检查节地址,以查看是否有重叠。 通常链接器将执行此检查,如果发现任何重叠,它将生成适当的错误消息。 链接器确实知道,并确实为覆盖图中的部分提供了许可。 可以使用命令行开关--check-sections恢复默认行为。

--cref

输出一个交叉引用表。 如果正在生成链接器映射文件,则将交叉引用表打印到映射文件。 否则,它将打印在标准输出上。

表的格式是故意简单的,以便在必要时可以通过脚本轻松处理。 这些符号被打印出来,按名称排序。 对于每个符号,都给出了一个文件名列表。 如果符号已定义,则列出的第一个文件是定义的位置。 其余文件包含对该符号的引用。

--no-限定共用

该选项禁止将地址分配给常用符号。 脚本命令“INHIBIT_COMMON_ALLOCATION”具有相同的效果。

--no-define-common选项允许解耦来自选择输出文件类型的地址分配给Common符号的决定; 否则不可重定位输出类型强制将地址分配给通用符号。 使用--no-define-common允许从共享库引用的通用符号仅在主程序中分配地址。 这消除了共享库中未使用的重复空间,并且还避免了在存在许多具有用于运行时符号解析的专用搜索路径的动态模块时解决错误重复的任何可能的混淆。

--defsym symbol = 表达式

在输出文件中创建一个全局符号,其中包含由expression给出的绝对地址。 您可以根据需要多次使用此选项,以在命令行中定义多个符号。 此上下文中表达式支持一种有限的算术形式:您可以给出一个十六进制常量或现有符号的名称,或者使用“+”和“ - ”来添加或减去十六进制常量或符号。 如果您需要更精细的表达式,请考虑使用脚本中的链接器命令语言。 注意: 符号 ,等号(`` = '')和表达式之间不应有空格。

--demangle [= 样式 ]

--no-还原函数

这些选项控制是否在错误消息和其他输出中去除符号名称。 当链接器被告知需要解除缩放时,它会尝试以可读的方式呈现符号名称:如果它们被对象文件格式使用,则将其删除前导下划线,并将C ++损坏的符号名称转换为用户可读的名称。 不同的编译器有不同的移动样式。 可选的demangling样式参数可用于为编译器选择合适的demangling样式。 除非设置了环境变量COLLECT_NO_DEMANGLE,否则默认情况下链接器会被取消 。 这些选项可用于覆盖默认值。

- 动态链接器 文件

设置动态链接器的名称。 这只在生成动态链接的ELF可执行文件时才有意义。 默认的动态链接器通常是正确的; 除非你知道你在做什么,否则不要使用它。

--embedded-relocs

此选项仅在将由-membedded-pic选项生成的MIPS嵌入式PIC代码链接到GNU编译器和汇编器时有意义。 它使链接器创建一个表,可以在运行时使用该表来重新定位静态初始化为指针值的任何数据。 有关详细信息,请参阅testsuite / ld-empic中的代码。

--fatal的警告

将所有警告视为错误

--force-EXE后缀

确保输出文件具有.exe后缀。

如果成功构建的完全链接的输出文件没有“ .exe ”或“ .dll ”后缀,则此选项会强制链接器将输出文件复制为具有“.exe”后缀的同名文件。 在Microsoft Windows主机上使用未修改的Unix makefile时,此选项很有用,因为除非以“.exe”后缀结尾,否则某些版本的Windows将不会运行映像。

--no-GC-节

--gc截面

启用垃圾收集未使用的输入节。 对不支持此选项的目标会被忽略。 该选项与-r不兼容,也不应与动态链接一起使用。 通过在命令行中指定--no-gc-sections ,可以恢复默认行为(不执行此垃圾回收 )。

- 帮帮我

打印标准输出上的命令行选项摘要并退出。

--target-帮助

打印标准输出上所有目标特定选项的摘要并退出。

-Map地图文件

将链接映射打印到文件映射文件。 请参阅上面的-M选项的说明。

--no-保持记忆

ld通常通过在内存中缓存输入文件的符号表来优化内存使用速度。 该选项告诉ld通过根据需要重新读取符号表来优化内存使用情况。 如果ld在链接大型可执行文件时耗尽了内存空间,则可能需要这样做

--no-未定义

-z defs

通常,在创建非符号共享库时,允许未定义的符号,并由运行时加载程序解决。 这些选项不允许使用这些未定义的符号。

--allow-多重定义

-z muldefs

通常当符号被定义多次时,链接器将报告一个致命错误。 这些选项允许多个定义,第一个定义将被使用。

--allow-SHLIB-未定义

即使设置了--no-undefined,也允许共享对象中的未定义符号。 最终结果是常规对象中的未定义符号仍然会触发错误,但共享对象中的未定义符号将被忽略。 no_undefined的实现会假设运行时链接程序将扼杀未定义的符号。 然而,至少有一个系统(BeOS)在共享库中的未定义符号是正常的,因为内核在加载时对它们进行修补,以选择哪个函数最适合当前体系结构。 IE动态选择一个适当的memset函数。 显然,HPPA共享库有未定义的符号也是正常的。

--no-未定义版本

通常,当符号具有未定义的版本时,链接器将忽略它。 此选项不允许使用未定义版本的符号,而是发出致命错误。

--no-警告不匹配

通常情况下,如果您尝试将由于某种原因不匹配的输入文件链接在一起,可能是因为它们已针对不同的处理器或不同的字节序进行了编译,那么ld会给出错误。 这个选项告诉ld它应该默默地允许这样的可能的错误。 只有在您采取了一些确保链接器错误不适当的特殊操作的情况下,才应谨慎使用此选项。

--no-整个归档

关闭随后存档文件的--whole-archive选项的效果。

--noinhibit-EXEC

只要它仍然可用,就保留可执行输出文件。 通常,链接器在链接过程中遇到错误时不会生成输出文件; 当它发出任何错误时它会退出而不写入输出文件。

-nostdlib

只搜索在命令行中明确指定的库目录。 链接器脚本中指定的库目录(包括在命令行中指定的链接器脚本)将被忽略。

--oformat 输出格式

ld可能被配置为支持多种类型的目标文件。 如果以这种方式配置了ld,则可以使用--oformat选项指定输出对象文件的二进制格式。 即使将ld配置为支持替代对象格式,通常也不需要指定此格式,因为应将ld配置为将每台机器上最常见的格式作为默认输出格式生成。 output-format是一个文本字符串,BFD库支持的特定格式的名称。 (您可以使用objdump -i列出可用的二进制格式。)脚本命令“OUTPUT_FORMAT”也可以指定输出格式,但是此选项将覆盖它。

-qmagic

Linux兼容性忽略此选项。

-Qy

对于SVR4兼容性,此选项被忽略。

- 放松

机器相关效果的选项。 该选项仅在少数目标上受支持。

在某些平台上,当链接器解析程序中的寻址时,-- relax选项执行全局优化,例如放宽地址模式并在输出目标文件中合成新指令。

在某些平台上,这些链接时间全局优化可能会导致生成的可执行文件无法进行符号调试 。 众所周知,松下MN10200和MN10300系列处理器就是这种情况。

在不支持此功能的平台上,可以接受--relax ,但会被忽略。

--retain-symbols-file filename

保留文件文件名中列出的符号,丢弃所有其他符号。 filename只是一个平面文件,每行一个符号名称。 此选项在环境(如VxWorks)中逐渐累积大型全局符号表时特别有用,以节省运行时内存。

--retain-symbols-file不会丢弃未定义的符号或重定位所需的符号。

您只能在命令行中指定--retain-symbols-file一次。 它覆盖了-s-S

-rpath 目录

将目录添加到运行时库搜索路径。 这在连接ELF可执行文件和共享对象时使用。 将所有-rpath参数连接起来并传递给运行时链接程序,该链接程序使用它们在运行时定位共享对象。 在查找明确包含在链接中的共享对象所需的共享对象时,也会使用-rpath选项; 请参阅-rpath-link选项的说明。 如果在链接ELF可执行文件时未使用-rpath,则将使用环境变量“LD_RUN_PATH”的内容(如果已定义)。

SunOS上也可以使用-rpath选项。 默认情况下,在SunOS上,链接器将从所有-L选项中构建一个运行时搜索补丁。 如果使用-rpath选项,则运行时搜索路径将仅使用-rpath选项形成,而忽略-L选项。 这在使用gcc时很有用,它会添加许多可能位于NFS挂载文件系统上的-L选项。

为了与其他ELF链接器兼容,如果-R选项后面跟有目录名称,而不是文件名,则将其视为-rpath选项。

-rpath-link DIR

使用ELF或SunOS时,一个共享库可能需要另一个共享库。 当“ld -shared”链接包含共享库作为输入文件之一时,会发生这种情况。

当链接器在执行非共享,不可重定位的链接时遇到这种依赖关系时,它将自动尝试找到所需的共享库并将其包含在链接中(如果未明确包含它)。 在这种情况下, -rpath-link选项指定要搜索的第一组目录。 -rpath-link选项可以通过指定由冒号分隔的名称列表或通过多次出现来指定一系列目录名称。

此选项应该谨慎使用,因为它会覆盖可能已被硬编译到共享库中的搜索路径。 在这种情况下,可能无意中使用与运行时链接程序不同的搜索路径。

链接器使用以下搜索路径来查找所需的共享库。

1。

任何由-rpath-link选项指定的目录。

2。

任何由-rpath选项指定的目录。 -rpath-rpath-link之间的区别在于,由-rpath选项指定的目录包含在可执行文件中并在运行时使用,而-rpath-link选项仅在链接时有效。 它仅适用于本地链接器。

3。

在ELF系统上,如果未使用-rpath和“rpath-link”选项,请搜索环境变量“LD_RUN_PATH”的内容。 它仅适用于本地链接器。

4。

在SunOS上,如果未使用-rpath选项,请搜索使用-L选项指定的任何目录。

5。

对于本机链接器,环境变量“LD_LIBRARY_PATH”的内容。

6。

对于本地ELF链接程序,将搜索共享库的“DT_RUNPATH”或“DT_RPATH”中的目录以查找其所需的共享库。 如果存在“DT_RUNPATH”条目,则会忽略“DT_RPATH”条目。

7。

默认目录,通常是/ lib/ usr / lib

8。

对于ELF系统上的本地链接程序,如果文件/etc/ld.so.conf存在,则在该文件中找到目录列表。

如果找不到所需的共享库,链接器将发出警告并继续链接。

-共享

-Bshareable

创建一个共享库。 目前仅支持ELF,XCOFF和SunOS平台。 在SunOS上,如果未使用-e选项并且链接中有未定义的符号,链接器将自动创建共享库。

--sort常见

该选项告诉ld在将常用符号放在适当的输出节中时按大小排序。 先来所有的一个字节符号,然后是所有的两个字节,然后是所有的四个字节,然后是一切。 这是为了防止由于对齐限制而导致符号之间的间隙。

- 按文件分割[ size ]

--split-by-reloc类似,但在达到大小时为每个输入文件创建一个新的输出节。 如果没有给出, 大小默认大小为1。

- split-by-reloc [ count ]

试图在输出文件中创建额外的部分,以便文件中没有单个输出部分包含多个重定位计数 。 这在生成巨大的可重定位文件以便用COFF目标文件格式下载到某些实时内核时非常有用; 因为COFF不能代表单个部分中的65535个以上的重定位。 请注意,这将无法使用不支持任意部分的目标文件格式。 链接器不会拆分单个输入段以便重新分配,因此如果单个输入段包含多个重定位,则一个输出段将包含多个重定位。 计数默认值为32768。

--stats

计算并显示有关链接器操作的统计信息,例如执行时间和内存使用情况。

--traditional格式

对于某些目标, ld的输出在某些方面与某些现有链接器的输出不同。 这个开关要求ld使用传统的格式。

例如,在SunOS上, ld将符号字符串表中的重复条目组合在一起。 这可以将具有完整调试信息的输出文件的大小减少30%以上。 不幸的是,SunOS“dbx”程序无法读取结果程序(“gdb”没有问题)。 --traditional-format开关告诉ld不合并重复条目。

--section-start sectionname = org

输出文件中找到由org指定的绝对地址的部分。 您可以根据需要多次使用此选项,以在命令行中找到多个部分。 org必须是单个十六进制整数; 为了与其他链接器兼容,您可以省略通常与十六进制值相关的前导0x注意: sectionname ,等号(`` = '')和org之间不应有空格。

-Tbss org

-T数据 组织

-Ttext org

分别使用org作为起始地址---输出文件的“bss”,“data”或“text”段。 org必须是单个十六进制整数; 为了与其他链接器兼容,您可以省略通常与十六进制值相关的前导0x

--dll-详细

--verbose

显示ld的版本号并列出支持的链接器仿真。 显示哪些输入文件可以打开也可以不打开。 显示链接器正在使用的链接器脚本。

--version-script = version-scriptfile

指定版本脚本的名称给链接器。 这通常用于创建共享库来指定有关正在创建的库的版本级别的附加信息。 该选项仅对支持共享库的ELF平台有意义。

--warn常见

当常用符号与另一个常用符号或符号定义组合时发出警告。 Unix连接器允许这种有点草率的做法,但其他一些操作系统上的连接器却不能。 该选项允许您通过组合全局符号来查找潜在的问题。 不幸的是,一些C库使用这种做法,所以你可能会得到一些有关库中以及程序中的符号的警告。

有三种全局符号,这里用C实例说明:

int i = 1;

一个定义,它位于输出文件的初始化数据部分。

extern int i;

一个未定义的参考,它不分配空间。 某处必须有变量的定义或通用符号。

int i;

一个共同的象征。 如果变量只有(一个或多个)通用符号,则它将进入输出文件的未初始化数据区域。 链接器将同一变量的多个通用符号合并为一个符号。 如果它们的尺寸不同,它会选择最大的尺寸。 如果存在相同变量的定义,则链接器将通用符号变成声明。

--warn-common选项可以产生五种警告。 每条警告都由一对线构成:第一条描述刚刚遇到的符号,第二条描述前一个遇到同名的符号。 两个符号中的一个或两个将是通用符号。

1。

将一个通用符号转换为引用,因为符号已经有了一个定义。

):warning:定义
)覆盖的的common:warning:此处定义

2。

将一个公共符号变成一个引用,因为遇到了符号的后续定义。 这与前面的情况相同,只是符号遇到不同的顺序。

):warning:定义覆盖常见的
)::warning:common is here

3。

将常用符号与先前相同大小的通用符号合并。

):warning:<的多个公共
):warning:先前的常见在这里

4。

将常用符号与前一个较大的常用符号合并。

):警告:被较大的公共
)覆盖的<的common:warning:较大的common在这里

5。

将常用符号与前一个较小的常用符号合并。 这与前面的情况相同,只是符号遇到不同的顺序。

):警告:<的common覆盖较小的常用
):warning:较小的common在这里

--warn-构造

警告如果使用任何全局构造函数。 这只对少数目标文件格式有用。 对于像COFF或ELF这样的格式,链接器无法检测到使用全局构造函数。

--warn海报-GP

如果输出文件中需要多个全局指针值,则发出警告。 这对于某些处理器(如Alpha)仅有意义。 具体而言,一些处理器将大数值常量放在特殊部分中。 一个特殊的寄存器(全局指针)指向本节的中间部分,以便可以通过基址寄存器相对寻址模式有效地加载常量。 由于基址寄存器相对模式的偏移是固定的并且相对较小(例如,16位),因此限制了常量池的最大大小。 因此,在大型程序中,为了能够处理所有可能的常量,通常需要使用多个全局指针值。 此选项会导致发生此情况时发出警告。

一次--warn

只对每个未定义的符号发出一次警告,而不是每个模块引用一次。

--warn截面对准

如果输出部分的地址由于对齐而改变,则发出警告。 通常,对齐将由输入部分设置。 只有在未明确指定的情况下,地址才会被更改; 也就是说,如果“SECTIONS”命令没有指定该部分的起始地址。

--whole归档

对于--whole-archive选项后命令行上提到的每个存档,请将链接中存档中的每个目标文件包括在内,而不是在存档中搜索所需的目标文件。 这通常用于将存档文件转换为共享库,从而强制每个对象都包含在生成的共享库中。 该选项可能会多次使用。

从gcc使用这个选项时需要注意两点:首先,gcc不知道这个选项,所以你必须使用-Wl,-whole-archive 。 其次,不要忘记在归档列表后面使用-Wl,-no-whole-archive ,因为gcc会将自己的归档列表添加到链接中,并且您可能不希望此标志影响这些归档。

- 包装 符号

使用符号的包装函数。 任何未定义的符号引用将被解析为“__ wrap_symbol”。 对“__real_symbol”的任何未定义的引用将被解析为符号

这可以用来为系统功能提供包装。 包装函数应该被称为“__wrap_symbol”。 如果它希望调用系统函数,它应该调用“__ real_symbol”。

这是一个微不足道的例子:

void * __wrap_malloc(int c){printf(“用%ld调用malloc \ n”,c); return __real_malloc(c); }

如果使用--wrap malloc将其他代码与此文件链接起来,则所有对“malloc”的调用都会调用函数“__wrap_malloc”。 在“__wrap_malloc”中调用“__real_malloc”将调用真正的“malloc”函数。

您也可能希望提供一个“__real_malloc”函数,这样没有--wrap选项的链接将会成功。 如果你这样做,你不应该把“__ real_malloc”的定义放在与“__wrap_malloc”相同的文件中; 如果这样做,汇编器可能会在链接器有机会将其包装到“malloc”之前解析调用。

--enable-新的DTAG

-禁用新的DTAG

这个链接器可以在ELF中创建新的动态标签。 但是旧的ELF系统可能不理解它们。 如果您指定--enable-new-dtags ,则会根据需要创建动态标签。 如果您指定--disable-new-dtags ,则不会创建新的动态标签。 默认情况下,不会创建新的动态标签。 请注意,这些选项仅适用于ELF系统。

i386 PE链接器支持-shared选项,这会使输出成为动态链接库(DLL)而不是常规可执行文件。 您应该在使用此选项时将输出命名为“* .dll”。 另外,链接器完全支持标准的“* .def”文件,这些文件可以在链接器命令行上指定为一个目标文件(实际上,它应该在存档之前导出符号,以确保它们链接到,就像一个普通的对象文件一样)。

除了所有目标所共有的选项外,i386 PE链接器还支持特定于i386 PE目标的其他命令行选项。 采用值的选项可以通过空格或等号分隔它们的值。

--add-STDCALL别名

如果给出,具有stdcall后缀(@ nn )的符号将按原样导出,并且也会剥离后缀。

- 基础文件 文件

使用file作为文件的名称,用于保存使用dlltool生成DLL所需的所有重定位的基

--dll

创建一个DLL而不是常规的可执行文件。 您也可以在给定的“.def”文件中使用-shared或指定“LIBRARY”。

--enable-STDCALL,修正

-禁用STDCALL,修正

如果链接找到它无法解析的符号,它将尝试通过查找另一个仅在符号名称(cdecl vs stdcall)格式上不同的已定义符号来执行“模糊链接”,并通过链接来解析该符号到比赛。 例如,未定义的符号“_foo”可能链接到函数“_foo @ 12”,或者未定义的符号“_bar @ 16”可能链接到函数“_bar”。 链接器执行此操作时,会打印警告,因为它通常应该无法链接,但有时从第三方dll生成的导入库可能需要此功能才能使用。 如果您指定--enable-stdcall-fixup ,则此功能已完全启用,并且不会打印警告。 如果您指定--disable-stdcall-fixup ,则禁用此功能,并将这种不匹配视为错误。

--export-所有符号

如果给定,用于构建DLL的对象中的所有全局符号都将由DLL导出。 请注意,如果不存在任何导出符号,则这是默认值。 当符号通过DEF文件显式导出或通过函数属性隐式导出时,默认情况下不导出任何其他内容,除非提供此选项。 请注意,符号“DllMain @ 12”,“DllEntryPoint @ 0”,“DllMainCRTStartup @ 12”和“impure_ptr”不会自动导出。 此外,从其他DLL导入的符号将不会被重新导出,也不会指定DLL内部布局的符号,例如以“_head_”开头或以“_iname”结尾的符号。 另外,将不会导出“libgcc”,“libstd ++”,“libmingw32”或“crtX.o”的符号。 不会导出名称以“__rtti_”或“__builtin_”开头的符号,以帮助C ++ DLL。 最后,还有一大堆没有导出的cygwin-private符号(显然,这适用于为cygwin目标构建DLL时)。

cygwin_premain2,cygwin_premain2,cygwin_premain2,cygwin_premain2,cygwin_premain2,cygwin_premain2,cygwin_premain2, “和”环境“。

- 排除 - 符号 符号 符号 ...

指定不应自动导出的符号列表。 符号名称可以用逗号或冒号分隔。

--exclude-libs lib lib ,...

指定不应自动导出符号的归档库列表。 库名可以用逗号或冒号分隔。 指定“--exclude-libs ALL”会从自动导出中排除所有归档库中的符号。 不管此选项如何,在.def文件中明确列出的符号仍将被导出。

--file对齐

指定文件对齐。 文件中的节将始终以文件偏移量开始,该偏移量是该数字的倍数。 这默认为512。

- 堆 预留

- 堆 预留 提交

指定要用作此程序的堆的要保留的内存量(以及可选的提交)。 默认值是1Mb保留,4K已提交。

- 图像基准

使用作为您的程序或dll的基地址。 这是加载程序或dll时将使用的最低内存位置。 为了减少重定位和提高你的dll性能的需要,每个应该有一个唯一的基址,并且不与其他任何dll重叠。 对于可执行文件,默认值为0x400000,对于dll,默认值为0x10000000。

--kill,在

如果给定,stdcall后缀(@ nn )将在导出之前从符号中去除。

- 主要图像版本

设置“图像版本”的主要编号。 默认为1。

- 主要版本的

设置“os版本”的主号码。 默认为4。

- 主要子系统版本

设置“子系统版本”的主号码。 默认为4。

--minor-image-version

设置“图像版本”的次要编号。 默认为0。

--minor-os-version

设置“os版本”的次要编号。 默认为0。

--minor-subsystem-version

设置“子系统版本”的次要编号。 默认为0。

--output-def 文件

链接器将创建文件文件 ,该文件将包含与链接器生成的DLL相对应的DEF文件。 这个DEF文件(应该被称为“* .def”)可以用来创建一个带有“dlltool”的导入库,或者可以用作自动或隐式导出符号的引用。

--out-implib 文件

链接器将创建文件文件 ,该文件将包含与链接器生成的DLL相对应的导入库。 这个导入库(应该被称为“* .dll.a”或“* .a”)可以用来将客户端链接到生成的DLL;这种行为使得跳过单独的“dlltool”导入库创建步骤成为可能。

--enable-自动图像基

自动为DLL选择图像库,除非使用“--image-base”参数指定。 通过使用从dllname生成的哈希来为每个DLL创建独特的图像库,可以避免可能延迟程序执行的内存中的冲突和重定位。

-禁用自动图像基

不要自动生成独特的图像库。 如果没有用户指定的图像库(“--image-base”),则使用平台默认值。

--dll-search-prefix 字符串

当动态链接到没有导入库的dll时,首先搜索“ .dll”,优先于“lib .dll”。 这种行为可以轻松区分为各种“子平台”构建的DLL:native,cygwin,uwin,pw等。例如,cygwin DLL通常使用“--dll-search-prefix = cyg”。

--enable-自动导入

对从DLL导入的数据进行“_symbol”到“__imp__symbol”的复杂链接,并在使用这些DATAexport构建导入库时创建必要的thunk符号。 这通常会“正常工作” - 但有时您可能会看到以下消息:

“变量''不能自动导入,请阅读ld的”--enable-auto-import“文档获取详细信息。”

当一些(子)表达式访问最终由两个常量(Win32导入表只允许一个)给出的地址时,会发生此消息。 发生这种情况的实例包括访问从DLL导入的结构变量的成员字段,以及将常量索引用于从DLL导入的数组变量。 任何多字变量(数组,结构体,long long等)都可能触发此错误条件。 但是,无论违规导出变量的确切数据类型如何,ld都会检测到它,发出警告并退出。

无论导出变量的数据类型如何,解决此问题的方法有多种:

一种方法是使用--enable-runtime-pseudo-reloc开关。 这会在您的客户端代码中为运行时环境调整引用的任务,因此此方法仅在运行时环境支持此功能时才起作用。

第二种解决方案是强制其中一个'常量'作为变量 - 即在编译时未知且不可优化。 对于数组,有两种可能性:a)使indexee(数组的地址)成为变量,或者b)使'常量'索引成为变量。 从而:

extern type extern_array []; extern_array [1] - > {volatile type * t = extern_array; t [1]}

要么

extern type extern_array []; extern_array [1] - > {volatile int t = 1; extern_array [t]}

对于结构体(以及大多数其他多字数据类型),唯一的选择是使结构本身(或long long或...)变量:

extern struct s extern_struct; extern_struct.field - > {volatile struct s * t =&extern_struct; t-> field}

要么

extern long long extern_ll; extern_ll - > {volatile long long * local_ll =&extern_ll; * local_ll}

处理这一难题的第三种方法是放弃违规符号的“自动导入”,并用“__declspec(dllimport)”标记它。 然而,在实践中,需要使用编译时#define来指示您是否在构建DLL,构建将链接到DLL的客户端代码,还是仅建立/链接到静态库。 在选择解决'直接地址与常量偏移'问题的各种方法之间进行选择时,应考虑典型的真实世界用法:

原版的:

--foo.h extern int arr []; --foo.c #include“foo.h”void main(int argc,char ** argv){printf(“%d \ n”,arr [1]); }

解决方案1:

--foo.h extern int arr []; --foo.c #include“foo.h”void main(int argc,char ** argv){/ *这个解决方法是针对win32和cygwin的; 不要“优化”* / volatile int * parr = arr; 的printf( “%d \ n” 个,帕尔[1]); }

解决方案2:

--foo.h / *注意:假定自动导出(no __declspec(dllexport))* / #if(defined(_WIN32)|| defined(__ CYGWIN__))&& \!(defined(FOO_BUILD_DLL)|| defined(FOO_STATIC ))#define FOO_IMPORT __declspec(dllimport)#else #define FOO_IMPORT #endif extern FOO_IMPORT int arr []; --foo.c #include“foo.h”void main(int argc,char ** argv){printf(“%d \ n”,arr [1]); }

避免这个问题的第四种方法是对库进行重新编码,以便为有问题的变量(例如set_foo()get_foo()访问器函数)使用函数接口而不是数据接口)。

-禁用自动导入

不要试图将“_symbol”与来自DLL的DATAimports的“__imp__symbol”进行诡秘的链接。

--enable-运行伪RELOC

如果您的代码包含--enable-auto-import部分中描述的表达式,即来自DLL的DATAimports具有非零偏移量,则此开关将创建“运行时伪重定位”向量,运行时环境可使用该向量来调整引用到您的客户端代码中的这些数据。

-禁用运行伪RELOC

不要为从DLL导入的非零偏移量数据创建伪重定位。 这是默认设置。

--enable-EXTRA-PE-调试

显示与自动导入符号插入有关的其他调试信息。

--section对齐

设置截面对齐。 内存中的节将始终在该数字的倍数的地址处开始。 默认为0x1000。

- 堆栈 储备

- 堆栈 储备 提交

指定要用作此程序的堆栈的内存量(可选地提交)。 默认是2Mb保留,4K提交。

- 子系统 哪个

- 子系统 主要

- 子系统 主要 次要

指定您的程序将在其下执行的子系统。 其合法值是“本地”,“窗口”,“控制台”和“posix”。 您也可以选择设置子系统版本。

重要提示:使用man命令( %man )查看特定计算机上的命令使用方式。