Skip to main content

所有关于Linux / Unix命令:ld

13 Linux命令 01 明确学习目标 (七月 2025)

13 Linux命令 01 明确学习目标 (七月 2025)
Anonim

名称

ld - 使用LD,GNU链接器

概要

ld 选项 OBJFILE …

描述

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

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

该手册页没有描述命令语言;看到了LD 请参阅“info”或手册ld:GNU链接器,以获取有关命令语言和GNU链接器其他方面的完整详细信息。

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

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

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

OPTIONS

链接器支持过多的命令行选项,但在实际操作中,很少使用它们在任何特定的上下文中。例如,经常使用LD 是在标准的受支持Unix系统上链接标准Unix目标文件。在这样的系统上,要链接文件“hello.o”:

我愿意 /lib/crt0.o hello.o -lc

这说明LD 生成一个名为的文件 产量 将文件“/lib/crt0.o”与“hello.o”和库“libc.a”链接起来,这将来自标准搜索目录。 (参见讨论-l 选项如下。)

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

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

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

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

对于名称为单个字母的选项,选项参数必须遵循选项字母而不插入空格,或者在紧跟需要它们的选项后立即作为单独的参数给出。

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

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

注 - 如果通过编译器驱动程序间接调用链接器(例如,GCC)然后所有的链接器命令行选项都应该加上前缀轮候册, (或适用于特定编译器驱动程序的任何内容),如下所示:

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

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

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

-一个 关键词

HP / UX兼容性支持此选项。该 关键词 参数必须是其中一个字符串档案, 共享, 要么默认. -aarchive 在功能上等同于-Bstatic,其他两个关键字在功能上等同于-Bdynamic。此选项可以使用任意次。

-一个 建筑

--architecture = 建筑

在当前版本中LD,此选项仅适用于Intel 960系列架构。在那里面LD 配置, 建筑 argument标识960系列中的特定体系结构,启用一些安全措施并修改存档库搜索路径。

未来的版本LD 可能支持其他架构系列的类似功能。

-b 输入格式

--format = 输入格式

LD 可以配置为支持多种目标文件。如果你的LD 这样配置,你可以使用-b 用于在命令行上为此选项指定输入对象文件的二进制格式的选项。即便LD 配置为支持备用对象格式,您通常不需要指定它,如LD 应该配置为期望作为默认输入格式的每台机器上最常用的格式。 输入格式 是一个文本字符串,是BFD库支持的特定格式的名称。 (您可以列出可用的二进制格式objdump -i.)

如果要使用不常见的二进制格式链接文件,则可能需要使用此选项。你也可以使用-b 通过包括显式切换格式(当链接不同格式的目标文件时)-b 输入格式 在每组特定格式的目标文件之前。

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

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

-C MRI-commandfile

--mri脚本= MRI-commandfile

为了与MRI产生的接头兼容,LD 接受以替代的受限命令语言编写的脚本文件,如GNU ld文档的MRI Compatible Script Files部分所述。使用该选项介绍MRI脚本文件-C;使用-T 运行以通用目的编写的链接描述文件的选项LD 脚本语言。如果 MRI-cmdfile完全无误 不存在,LD在any指定的目录中查找它-L 选项。

-d

-dc

-dp

这三个选项是等价的;支持多种形式以与其他链接器兼容。即使指定了可重定位的输出文件,它们也会为常用符号分配空间(使用-r)。脚本命令“FORCE_COMMON_ALLOCATION”具有相同的效果。

-e 条目

--entry = 条目

使用 条目 作为开始执行程序的显式符号,而不是默认入口点。如果没有命名的符号 条目 ,链接器将尝试解析 条目 作为一个数字,并使用它作为入口地址(该数字将在基数10中解释;您可以使用前导0X 对于基数16,或领先0 对于基地8)。

-E

--export动态

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

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

如果使用“dlopen”加载需要引用程序定义的符号的动态对象,而不是某些其他动态对象,则在链接程序本身时可能需要使用此选项。

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

-EB

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

-EL

链接little-endian对象。这会影响默认输出格式。

-F

--auxiliary 名称

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

如果稍后将程序与此过滤器对象链接,则在运行程序时,动态链接器将看到DT_AUXILIARY字段。如果动态链接器解析过滤器对象中的任何符号,它将首先检查共享对象中是否存在定义 名称 。如果有,则将使用它而不是过滤器对象中的定义。共享对象 名称 不需要存在。因此共享对象 名称 可用于提供某些功能的替代实现,可能用于调试或用于机器特定的性能。

可以多次指定此选项。 DT_AUXILIARY条目将按照它们在命令行中出现的顺序创建。

-F 名称

- 过滤 名称

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

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

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

-fini 名称

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

-G

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

-G

--gpsize =

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

-H 名称

-soname = 名称

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

-一世

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

-在里面 名称

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

-l 档案

--library = 档案

添加存档文件 档案 到要链接的文件列表。此选项可以使用任意次。LD 将搜索其路径列表中的每一个“libarchive.a”的出现 档案 指定。

在支持共享库的系统上,LD 也可以搜索扩展名不是“.a”的库。具体来说,在ELF和SunOS系统上,LD 在搜索扩展名为“.a”的库之前,将在目录中搜索扩展名为“.so”的库。按照惯例,“。so”扩展名表示共享库。

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

-( 强制链接器多次搜索存档的方法的选项。

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

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

-L searchdir

--library路径= 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 水平

如果 水平 是大于零的数值LD 优化输出。这可能需要更长的时间,因此可能只应为最终二进制文件启用。

-q

--emit-relocs

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

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

-r

--relocateable

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

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

这个选项与之相同-一世.

-R 文件名

--just符号= 文件名

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

为了与其他ELF连接器兼容,如果-R 选项后跟一个目录名,而不是文件名,它被视为-rpath 选项。

-s

--strip-ALL

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

-S

--strip调试

从输出文件中省略调试器符号信息(但不是所有符号)。

-t

- 跟踪

将输入文件的名称打印为LD 处理它们。

-T 脚本文件

--script = 脚本文件

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

-u 符号

--undefined = 符号

力 符号 作为未定义的符号输入到输出文件中。例如,这样做可以触发标准库中其他模块的链接。-u 可以使用不同的选项参数重复输入其他未定义的符号。此选项等同于“EXTERN”链接描述文件命令。

-ur

对于C ++程序以外的任何其他内容,此选项相当于-r:它生成可重定位的输出---即输出文件,该输出文件又可以作为输入LD。链接C ++程序时,-ur 不 解析对构造函数的引用,不像-r。它无法使用-ur 在自己链接的文件上-ur;一旦构建了构造函数表,就无法添加它。使用-ur 仅适用于最后一个部分链接,和-r 为了其他人。

--unique = 部分

为每个匹配的输入节创建单独的输出节 部分 ,或者如果是可选的通配符 部分 每个孤儿输入部分都缺​​少参数。孤立部分是链接描述文件中未特别提及的部分。您可以在命令行上多次使用此选项;它会阻止正常合并具有相同名称的输入节,从而覆盖链接描述文件中的输出节分配。

-v

- 版

-V

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

-X

--discard,所有

删除所有本地符号。

-X

--discard本地人

删除所有临时本地符号。对于大多数目标,这是名称以其开头的所有本地符号大号.

-y 符号

--trace符号= 符号

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

如果链接中有未定义的符号但不知道引用的来源,则此选项很有用。

-Y 路径

加 路径 到默认的库搜索路径。此选项用于Solaris兼容性。

-z 关键词

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

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

-( 档案 -)

--start组 档案 --end组

该 档案 应该是档案文件列表。它们可以是显式文件名,也可以是-l选项。

将重复搜索指定的归档,直到未创建新的未定义引用。通常,只按命令行中指定的顺序搜索存档一次。如果需要该存档中的符号来解析稍后在命令行中显示的存档中的对象引用的未定义符号,则链接器将无法解析该引用。通过对存档进行分组,可以反复搜索所有存档,直到解决所有可能的引用。

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

--accept未知输入拱

--no-接受未知输入拱

告诉链接器接受无法识别其体系结构的输入文件。假设用户知道他们正在做什么,并故意想要链接这些未知的输入文件。在2.14版之前,这是链接器的默认行为。从版本2.14开始的默认行为是拒绝这样的输入文件,所以--accept未知输入拱 已添加选项以还原旧行为。

-断言 关键词

对于SunOS兼容性,将忽略此选项。

-Bdynamic

-dy

-call_shared

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

-Bgroup

在动态部分的“DT_FLAGS_1”条目中设置“DF_1_GROUP”标志。这会导致运行时链接程序处理此对象中的查找,并且只能在组内执行其依赖项。--no-未定义 隐含着。此选项仅在支持共享库的ELF平台上有意义。

-Bstatic

-dn

-non_shared

-静态的

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

-Bsymbolic

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

--check截面

--no检查截面

询问链接器 不 在分配地址后查看部分地址以查看是否存在重叠。通常,链接器将执行此检查,如果发现任何重叠,它将生成合适的错误消息。链接器确实知道并且确实允许覆盖中的部分。可以使用命令行开关恢复默认行为--check截面.

--cref

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

表的格式有意简单,因此如果需要,可以通过脚本轻松处理。打印出符号,按名称排序。对于每个符号,给出了文件名列表。如果定义了符号,则列出的第一个文件是定义的位置。其余文件包含对符号的引用。

--no-限定共用

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

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

--defsym 符号 = 表达

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

--demangle = 样式

--no-还原函数

这些选项控制是否在错误消息和其他输出中对符号名称进行解码。当链接器被告知要解码时,它会尝试以可读的方式呈现符号名称:如果它们被目标文件格式使用,它会剥离前导下划线,并将C ++受损的符号名称转换为用户可读的名称。不同的编译器具有不同的修改样式。可选的demangling样式参数可用于为编译器选择适当的demangling样式。除非环境变量,否则链接器将默认为demangleCOLLECT_NO_DEMANGLE 已设定。这些选项可用于覆盖默认值。

--dynamic - 衔接 文件

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

--embedded-relocs

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

--fatal的警告

将所有警告视为错误。

--force-EXE后缀

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

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

--no-GC-节

--gc截面

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

- 救命

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

--target-帮助

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

-地图 映射文件

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

--no-保持记忆

LD 通常通过缓存内存中输入文件的符号表来优化内存使用速度。这个选项说明LD 而是通过重新读取符号表来优化内存使用。如果这可能是必需的LD 链接大型可执行文件时耗尽内存空间。

--no-未定义

-z defs

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

--allow-多重定义

-z muldefs

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

--allow-SHLIB-未定义

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

--no-未定义版本

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

--no-警告不匹配

一般LD 如果您尝试将由于某种原因不匹配的输入文件链接在一起会产生错误,可能是因为它们已针对不同的处理器或不同的字节序编译。这个选项说明LD 它应该默默地允许这样的错误。如果您采取了一些特殊操作来确保链接器错误不合适,则只应谨慎使用此选项。

--no-整个归档

关掉的效果--whole归档 后续存档文件的选项。

--noinhibit-EXEC

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

-nostdlib

仅搜索命令行中显式指定的库目录。链接描述文件中指定的库目录(包括命令行中指定的链接描述文件)将被忽略。

--oformat 输出格式

LD 可以配置为支持多种目标文件。如果你的LD 这样配置,你可以使用--oformat 用于指定输出对象文件的二进制格式的选项。即便LD 配置为支持备用对象格式,您通常不需要指定它,如LD 应配置为生成每台计算机上最常用格式的默认输出格式。 输出格式 是一个文本字符串,是BFD库支持的特定格式的名称。 (您可以列出可用的二进制格式objdump -i。)脚本命令“OUTPUT_FORMAT”也可以指定输出格式,但是此选项会覆盖它。

-qmagic

对于Linux兼容性,将忽略此选项。

-Qy

SVR4兼容性忽略此选项。

- 放松

具有机器相关效果的选项。仅在少数目标上支持此选项。

在某些平台上, - 放松 选项执行全局优化,当链接器解析程序中的寻址时,可以实现全局优化,例如放宽地址模式和在输出对象文件中合成新指令。

在某些平台上,这些链接时间全局优化可能使得生成的可执行文件的符号调试变得不可能。众所周知,Matsushita MN10200和MN10300系列处理器就属于这种情况。

在不支持此功能的平台上, - 放松 被接受,但被忽略了。

--retain符号文件 文件名

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

--retain符号文件 不 不 丢弃未定义的符号或重定位所需的符号。

您只能指定--retain符号文件 一次在命令行中。它覆盖了-s-S.

-rpath DIR

将目录添加到运行时库搜索路径。将ELF可执行文件与共享对象链接时使用此方法。所有-rpath 参数被连接并传递给运行时链接程序,后者使用它们在运行时查找共享对象。该-rpath 当定位链接中明确包含的共享对象所需的共享对象时,也使用选项;看到的描述-rpath链接 选项。如果-rpath 链接ELF可执行文件时不使用,如果已定义,将使用环境变量“LD_RUN_PATH”的内容。

-rpath 选项也可以在SunOS上使用。默认情况下,在SunOS上,链接器将形成所有的运行时搜索补丁-L 给出的选择。如果一个-rpath 使用选项,运行时搜索路径将仅使用-rpath 选项,忽略了-L选项。这在使用gcc时很有用,它增加了很多-L 可能在NFS安装的文件系统上的选项。

为了与其他ELF连接器兼容,如果-R 选项后跟一个目录名,而不是文件名,它被视为-rpath 选项。

-rpath链接 DIR

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

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

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

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

1.

任何指定的目录-rpath链接 选项。

2.

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

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中 exists,在该文件中找到的目录列表。

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

-共享

-Bshareable

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

--sort常见

这个选项说明LD 在将公共符号放在适当的输出节中时,按大小对公共符号进行排序。首先是所有的一个字节符号,然后是所有的两个字节,然后是所有四个字节,然后是其他所有内容。这是为了防止由于对齐约束而导致的符号之间的间隙。

- 按文件分类 尺寸

相近--split逐RELOC 但是当为每个输入文件创建一个新的输出部分 尺寸 到达了。 尺寸 如果没有给出,则默认大小为1。

--split-by-reloc 计数

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

--stats

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

--traditional格式

对于某些目标,输出LD 在某些方面与某些现有链接器的输出不同。此切换请求LD 改为使用传统格式。

例如,在SunOS上,LD 组合符号字符串表中的重复条目。这可以将输出文件的大小减少超过30%的完整调试信息。不幸的是,SunOS“dbx”程序无法读取生成的程序(“gdb”没有问题)。该--traditional格式 开关说LD 不合并重复的条目。

--section启动 sectionname = 组织

在输出文件中找到由给定的绝对地址处的节 组织 。您可以根据需要多次使用此选项,以在命令行中找到多个部分。 组织 必须是一个十六进制整数;为了与其他链接器兼容,您可以省略前导0X 通常与十六进制值相关联。 注意: 两者之间应该没有空白区域 sectionname ,等号(``=''),和 组织 .

-Tbss 组织

-Tdata 组织

-Ttext 组织

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

--dll-详细

--verbose

显示版本号LD 并列出支持的链接器仿真。显示可以打开和不能打开的输入文件。显示链接器使用的链接描述文件。

--version脚本= 版本脚本文件

为链接器指定版本脚本的名称。这通常在创建共享库时使用,以指定有关正在创建的库的版本层次结构的其他信息。此选项仅在支持共享库的ELF平台上有意义。

--warn常见

当公共符号与另一个公共符号或符号定义组合时发出警告。 Unix连接器允许这种有点草率的练习,但其他一些操作系统上的连接器则不然。此选项允许您通过组合全局符号查找潜在问题。不幸的是,一些C库使用这种做法,因此您可能会对库中的符号以及程序中的符号发出警告。

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

int i = 1;

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

extern int i;

未定义的引用,不分配空间。在某处必须有变量的定义或公共符号。

int i;

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

--warn常见 选项可以产生五种警告。每个警告由一对行组成:第一行描述刚刚遇到的符号,第二行描述遇到的具有相同名称的符号。两个符号中的一个或两个将是共同的符号。

1.

将公共符号转换为引用,因为已经有符号的定义。

(

):警告:常见的`'按定义覆盖 (
):警告:这里定义

2.

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

(

):警告:定义`'压倒一切 (
):警告:常见的就在这里

3.

将公共符号与先前相同大小的公共符号合并。

(

):警告:多个常见的`' (
):警告:以前的常见就在这里

4.

将公共符号与先前较大的公共符号合并。

(

):警告:常见的`'被更大的共同所覆盖 (
):警告:这里有更大的共同点

5.

将公共符号与先前较小的公共符号合并。这与前一种情况相同,只是符号以不同的顺序遇到。

(

):警告:常见的`'压倒较小的共同点 (
):警告:较小的常见在这里

--warn-构造

如果使用任何全局构造函数,则发出警告。这仅适用于少数目标文件格式。对于COFF或ELF等格式,链接器无法检测全局构造函数的使用。

--warn海报-GP

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

一次--warn

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

--warn截面对准

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

--whole归档

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

从gcc使用此选项时的两个注意事项:首先,gcc不知道此选项,因此您必须使用轮候册,-whole归档。其次,别忘了使用轮候册,-no-整个归档在您的归档列表之后,因为gcc会将自己的归档列表添加到您的链接中,您可能也不希望此标志也影响这些归档。

- 包裹 符号

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

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

这是一个简单的例子:

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

如果您使用此文件链接其他代码--wrap malloc,然后对“malloc”的所有调用都将调用函数“__wrap_malloc”。 “__wrap_malloc”中对“__real_malloc”的调用将调用真正的“malloc”函数。

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

--enable-新的DTAG

- 禁用新的DTAG

此链接器可以在ELF中创建新的动态标记。但旧的ELF系统可能无法理解它们。如果你指定--enable-新的DTAG,动态标签将根据需要创建。如果你指定 - 禁用新的DTAG,不会创建新的动态标签。默认情况下,不会创建新的动态标记。请注意,这些选项仅适用于ELF系统。

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

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

--add-STDCALL别名

如果给定,带有stdcall后缀的符号(@ NN )将按原样导出,并且后缀将被剥离。

--base文件 文件

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

--dll

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

--enable-STDCALL,修正

- 禁用STDCALL,修正

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

--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私有符号列表未导出(显然,这适用于为cygwin目标构建DLL)。

这些cygwin排除的是:“_ cygwin_dll_entry @ 12”,“_ cygwin_crt0_common @ 8”,“_ cygwin_noncygwin_dll_entry @ 12”,“_ fmode”,“_ impure_ptr”,“cygwin_attach_dll”,“cygwin_premain0”,“cygwin_premain1”,“cygwin_premain2”,“cygwin_premain3 “和”环境“。

--exclude符号 符号 , 符号 ,…

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

--exclude-库 LIB , LIB ,…

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

--file对齐

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

- 堆 保留

- 堆 保留 , 承诺

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

--image基

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

--kill,在

如果给出,stdcall后缀(@ NN )在导出之前将从符号中剥离。

- 主要图像版本

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

- 主要操作系统版本

设置``os version''的主要编号。默认为4。

- 主要子系统版本

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

--minor图像版本

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

--minor-OS版本

设置``os version''的次要编号。默认为0。

--minor子系统版本

设置“子系统版本”的次要编号。默认为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搜索前缀

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

--enable-自动导入

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

“变量”'无法自动导入。有关详细信息,请阅读ld的“--enable-auto-import”文档。“

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

无论导出变量的数据类型如何,有几种方法可以解决这个难题:

一种方法是使用--enable-runtime-pseudo-reloc开关。这样就可以在客户端代码中为运行时环境调整引用,因此只有在运行时环境支持此功能时,此方法才有效。

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

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)”标记它。但是,在实践中,需要使用编译时#defines来指示您是在构建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 / *注意:假定自动导出(没有__declspec(dllexport))* / #if(已定义(_WIN32)||已定义(__ CYGWIN__))&& !(已定义(FOO_BUILD_DLL)||已定义(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() 访问者功能)。

- 禁用自动导入

不要尝试从DLL中对DATAimports进行“_symbol”到“__imp__symbol”的复杂链接。

--enable-运行伪RELOC

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

- 禁用运行伪RELOC

不要为DLL的非零偏移DATA导入创建伪重定位。这是默认值。

--enable-EXTRA-PE-调试

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

--section对齐

设置节对齐。内存中的段始终从地址开始,这些地址是此数字的倍数。默认为0x1000。

- 堆 保留

- 堆 保留 , 承诺

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

--subsystem 哪一个

--subsystem 哪一个 : 重大的

--subsystem 哪一个 : 重大的 . 次要

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

重要: 使用 人 命令( % 人 )查看特定计算机上如何使用命令。