原文地址
类似博文,有些翻译与原版有冲突且版本可能较旧
注: 多数命令脚本的引用文章翻译都在这里,文中引用的为英文原文引用地址.
2.1 Command Line Options
链接器支持多种命令行选项,但实际上在一个实际的使用中只会用到一小部分.常用的ld命令是连接标准的unix目标文件。例如:
ld -o output /lib/crt0.o hello.o -lc
此命令告诉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’,而’–omagic’命令将会在输出中设置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接受的常用的命令行:
@fileRead:
从文件得到命令行选项。读取到的选项被插入@file之前的位置。如果文件不存在,或者不能被读取,这个选项将会当作字面意思处理,且不会被移除。
文件中的选项以空格分隔。一个命令和空格由包围在其两侧的单引号或者双引号组成。任何字符(包括反斜杠)都可以以前面加一个反斜杠的形式存储。文件本身可以包含@file命令,这些命令将会被递归的调用。
-a keyword
此选项支持HP/UX。keyword参数必须为以下参数之一:’archive’,’shared’或者’default’,’-a archive’在功能上等同于’-Bstatic’,其它两个选项等同于’-Bdynamic’,此选项可以被多次使用。
–audit AUDITLIB
把AUDITLIB添加到动态段的DT_AUDIT入口。AUDITLIB不会检查其是否存在,也不会使用库中指出的DT_SONAME。如果多次指定此命令,DT_AUDIT将会包含一个克隆的分隔的列表用于审计接口。如果链接器查找共享库时,在审计接口里找到了目标,其将会添加一个DT_DEPAUDIT入口在生成文件中。此选项仅在ELF支持的rtld-audit接口才有实际意义。
-A architecture
–architecture=architecture
目前仅支持Intel 960 系列。
-b input-format / –format=input-format
ld被设计为可以支持多种格式的目标文件。如果需要ld这么做,可以使用’-b’选项指出紧随其后的目标文件的二进制格式。虽然ld被设计为支持很多种目标文件格式,但一般来说无需特别指定此选项,ld默认使用最为广泛的格式。input-format是一个字符串,支持的字符串由BFD库支持。(可以使用’objdump -i’察看)。请参考BFD
在使用不同格式的目标文件时可能会需要此选项,也可以显式的在每组不同格式的文件前使用’-b’选项来切换格式。
默认的格式从环境变量GNUTARGET获得,请参考Enviroment,也可以使用脚本定义输入,使用TARGET命令,请参考Format Commands
-c MRI-commandfile / –mri-script=MRI-commandfile
为了能够使用MRI产生的链接器,ld接受另一种严格的脚本文件,具体描述参考MRI Compatible Script Files。使用MRI脚本则用命令’-c’;使用普通脚本则使用命令’-T’。如果MRI文件不存在,ld将在所有’-L’指出的位置寻找。
-d / -dc / -dp
此三个选项是一样的;多种形式被用来和别的类型的链接器配合。这些命令为普通符号分配空间,即便已经使用’-r’命令要求声成可再分配文件。此命令等同于脚本命令FORCE_COMMON_ALLOCATION,参见Miscellaneous Commands。
–depaudit AUDITLIB / -P AUDITLIB
参考–audit命令,-P选项为了Solaris系统而设计.
-e entry / –entry=entry
使用entry作为显示指定的程序执行入口,而不是默认的入口。如果没有与符号名相同的入口,链接器将会尝试将其翻译成一个数字,并且以入口地址的形式使用它(地址默认使用10进制,可以用’0x’指定16进制,或者’0’指定8进制)。参考Entry point。
–exclude-libs lib,lib,…
仅用于i386 PE下的ELF文件中。
–exclude-modules-for-implib module,module,…
仅用于i386 PE中。防止自动输出变量名称。
-E / –export-dynamic / –no-export-dynamic
当创建一个含有动态链接库的执行文件时,使用-E选项或者–export-dynamic选项,可以让链接器将所有符号都加入到动态符号表内部。动态符号表是所有动态目标文件在运行时所能看见的符号的集合。
如果你不使用这个选项(或者使用–no-export-dynamic恢复了默认的行为),动态表将会仅含有动态目标在链接中提到的符号。
如果使用dlopen来加载动态文件,而动态文件又需要参照程序其他部分定义的符号且不是动态文件中的符号时,你可能会需要在链接程序时使用这个选项。
如果输出格式支持的话,也可以适用动态列表来控制哪个符号应当加入动态符号表。察看’–dynamic-list’的描述。
注意这个选项仅支持ELF目标的文件,PE目标有类似的函数输出DLL或者EXE的所有符号,参考’–export-all-symbols’的描述。
-EB
Link big-endian objects. This affects the default output format.
链接大端目标,此选项影响最终输出格式
-EL
Link little-endian objects. This affects the default output format. 链接小端目标,此选项影响最终输出格式
-f name / –auxiliary=name
生成一个ELF共享目标时,将内部的DT_AUXILIARY域设置为指定的name。这将告诉动态链接器:在共享目标中的符号表将被当作一个附属滤波器,用于共享目标name下的符号表之上。
如果晚些时候使用此过滤目标链接程序,当程序运行时,动态连接器将会察看DT_AUXILIARY域。如果动态连接器在过滤目标发现了任何相关符号,它将首先检查是否在共享目标存在一个定义。如果有,将会适用共享目标替代过滤目标。共享目标中不一定有此定义。因此共享目标名可以被用来提供对不同应用的替换策略,或者用于debug或者机器特殊的需要。
此选项可以被多次使用,DT_AUXILIARY以在命令行上出现的顺序创建。
-F name / –filter=name
当创建ELF共享目标时,将内部DT_FILTER设置为name。这将通知动态连接器,共享目标的符号表在生成时应该被当作一个将使用在共享目标的过滤器使用。
如果稍后用其创建一个程序,在运行时,动态连接器会查看DT_FILTER域,如果有相同的符号,将会适用共享目标中的定义。因此过滤目标可以被用来选择一个目标提供的子集。
-fini=name
生辰ELF执行文件或共享目标时,当执行文件或者共享目标被关闭时调用NMAE,通过设置DT_FINI到函数地址实现。通常,连接器使用_fini当作调用的程序。
-g
忽略,为配合其他工具而设。
-G value / –gpsize=value
设置最大的GP容量,仅用于MIPS ELF等支持将大的和小的目标放到不同段的格式,其他文件格式自动忽略此命令。
-h name / -soname=name
创建ELF共享目标时,将内部DT_SONAME域设置为name。当使用此文件生成可执行文件时,可执行文件运行动态链接器俄时候,将会尝试优先读取DT_SONAME域指定的共享目标而不是链接器给出的目标。
-i
产生增量链接(与’-r’类似)。
-init=name
创建ELF执行文件或者共享目标时,在可执行文件或者共享目标被加载时调用NAME。也可通过设置DT_INIT为某函数地址实现,默认情况下链接器将_init当作要调用的函数。
-l namespec / –library=namespec
将namespec指出的库文件或者目标文件加入链接文件列表。此选项可以多次使用。如果namespec是如下的格式’:filename’,ld会搜索库路径来寻找filenam指定的文件,否则将会搜索库路径寻找名为lib(namespec).a的文件。
在其他支持共享库的系统中,ld可能也会搜索其他的文件名。特别是在SunOs的ELF系统上,ld还会在搜索libnamespec.a前搜索libnamespec.so。但此特性并不影响’:filename’的使用方式。
链接器只会在给定地址搜索一次库文件。如果库定义了一个符号此前没有被定义过,链接器会包含appropriate文件,但是此后命令中含有一个未定义符号,链接器不会重新搜索库。
参考’-(‘命令,可以让链接器多次搜索库。
可以在命令中多次列出同一个库。
-L searchdir / –library-path=searchdir
为搜索库和目标文件添加搜索路径。可以多次使用此命令,ld将会按照命令中给定的顺序进行搜索。给定的目录会先于默认目录搜索。所有-L命令都会提供给-l,无论顺序如何。-L不会影响ld命令搜索链接脚本,除非使用了-T命令。
如果searchdir以’=’开头,则’=’将会被系统根目录参数替换,由’–sysroot’命令控制。
默认的搜索路径(不用’-L’指定)取决于ld的仿真方式,一些情况下还要取决于其如何设置的,参考Environment
路径也可以由SEARCH_DIR命令指定的脚本设置。这样设置的搜索路径与在命令行设置的路径等同对待。
-m emulation
仿真emulation链接器。可以用命令’–verbose’或’-V’列出可使用的emulation。
如果-m选项未使用,仿真器由环境变量LDEMULATION指出,如果定义了的话。
否则默认的仿真器取决于链接器的设置。
-M / –print-map
打印一个链接表到标准输出。链接表提供链接的信息,包括以下部分:
- 目标文件映射到内存的哪个位置
- 普通符号如何分配的
- 所有包含在链接内部的库以及提到库从而使得库被引入的符号。
- 符号被设置的值
注意 -符号的值由前面的表达式计算且计算包含了符号此前的值的情况,符号的值可能会有不正确的显示。这是因为链接器不参考中间结果且仅保留表达式最后的值。在此种环境下,链接器将会用中括号包裹显示最后的数值。因此例如一个链接器脚本包含如下:
foo = 1
foo = foo * 4
foo = foo + 8
将会在-m选项中输出如下信息:
0x00000001 foo = 0x1
[0x0000000c] foo = (foo * 0x4)
[0x0000000c] foo = (foo + 0x8)
参考Expressions获取更多的关于脚本表达式的信息。
-n / –nmagic
关闭段的页对齐,关闭共享库的连接。如果输出格式支持Unix风格魔术字,标记输出为NMAGIC。
-N / –omagic
设置代码段和数据段可读写。并且,关闭段的页对齐,关闭共享库的连接。如果输出格式支持Unix风格魔术字,标记输出为OMAGIC。注意:虽然PE-COFF目标支持可写的代码段,但在Microsoft发行的说明中并没有同意这么做。
–no-omagic
与-N相对,将代码段设置为只读,并强制段为页对齐。注意此选项并没有使能链接共享库。使用-Bdynamic达到此功能。
-o output / –output=output
使用output作为ld产生的输出。如果不指定output,则默认为a.out。脚本名ingOUTPUT也可以达到相同的目的。
-O level
如果level是一个数字且值大于0,ld优化输出。这可能会引发明显的长时间运行,因此尽量在最终链接时使用。当前此选项仅影响ELF的共享库生成。未来的版本中,链接器可能会有更多的功能。
–push-state
–push-state允许将当前控制输入文件的一些参数进行保存。如此一来这些参数可以通过–pop-state选项恢复。
相关的命令有:-Bdynamic, -Bstatic, -dn, -dy, -call_shared, -non_shared, -static, -N, -n, –whole-archive, –no-whole-archive, -r, -Ur, –copy-dt-needed-entries, –no-copy-dt-needed-entries, –as-needed, –no-as-needed, -a
使用这个命令的一个特殊目的是因为pkg-config命令,当使用了–libs选项,所有可能需要的库都被列出,并且在所有事件都处于可被链接的状态。因此使用过后将一些东西恢复原样比较好,例如:
-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state
取消–push-state后的效果,恢复此前输入文件的参数。
-q / –emit-relocs
留下重定位段并使其包含于完全链接的可执行文件中。后链接分析和适配工具为了正确的执行编译可能会需要这个信息。此命令会产生较大的执行文件。
此命令目前仅支持ELF平台。
–force-dynamic
强制输出文件拥有动态段,此选项为VxWorks目标而特别设计。
-r / –relocatable
产生可重定位的输出。例:产生一个输出文件,可以反过来作为ld的输入文件。这常被称为部分链接。一个附加的效果是,在支持标准Unix魔数的环境中,这个命令也会将输出文件的魔数为OMAGIC。如果此选项没有适用,一个绝对定位的文件将会被产生。在链接C++程序时,此选项不会解析构造器的参数,如果想这么做,使用’-Ur’。
若一个输入文件跟输出文件格式不同,只有在输入文件不含任何重定位信息时部分链接才被支持。不同的输出格式可能有更多的限制,例如:其他输入格式的文件产生的a.out完全不支持部分链接。
此选项与’-i’类似。
-R filename / –just-symbols=filename
从filename中读取符号名和它们的地址,但不重新定位他们,或者将它们包含在输出文件中。这允许通过参考其他程序定义的内存中绝对地址的符号产生输出。此命令可以多次使用。为了与其他ELF链接器搭配,如果-R命令后面跟着一个目录名字,而不是一个文件名,他将被当作-rpath命令使用。
-s / –strip-all
忽略输出文件中所有的符号信息。
-S / –strip-debug
输出文件忽略调试符号信息(但不是所有符号)。
-t / –trace
打印所有ld处理的输入文件的变量。
-T scriptfile / –script=scriptfile
使用脚本文件scriptfile作为链接器脚本。此脚本替换ld的默认链接脚本(而不是加入进去),因此命令文件必须给出所有生成输出文件所需的东西。参见Scripts。如果脚本文件不含在当前目录内,ld会查找所有’-L’指定的路径。’-T’命令可以互相累积。
-dT scriptfile / –default-script=scriptfile
使用脚本文件scriptfile作为默认链接器脚本,参见Scripts。此命令与–script命令类似,除了脚本的执行会推迟到其他命令行被执行完毕后。这个特性允许在–default-script选项后面的命令可以影响到链接脚本。在命令行不能够由用户自己控制的情况下此命令非常有用。(例如 因为命令行由其他工具创建,比如’gcc’)。
-u symbol / –undefined=symbol
强制一个符号作为未定义的符号输出到输出文件。这么做的意义在于,例如,触发额外的标准库的链接。’-u’可能在不同的命令参数中重复使用来引入额外的未定义符号。此选项等同于脚本命令’EXTERN’。
如果此选项被使用来强制额外符号输出到输出文件,而发生了一个错误使得符号仍然处于未定义状态,则应使用替代选项’–require-defined’。
–require-defined=symbol
确认一个符号是否在输出文件中定义。此选项与–undefined类似,除了如果符号未定义,则链接器会提交一个错误并退出。脚本命令EXTERN, ASSERT, DEFINED一起使用可以达到同样效果。此选项可以多次使用来获取额外的符号。
-Ur
在其他不是C++的程序中,此选项等同语’-r’。
在链接C++程序时,’-Ur’为构造函数传递参照信息,这点与’-r’不同。如果’-Ur’文件使用’-Ur’链接的文件时,将无法工作;一旦构造函数表被构建,将无法被再次添加。只在最后一次部分链接时使用’-Ur’,而其他步骤使用’-r’命令。
–orphan-handling=MODE
控制“孤儿”段如何处理。一个孤儿段是一个未被链接脚本提及的段。参见Orphan Sections。
MODE可以拥有以下的值:
place: 孤儿段根据在孤儿段中描述的策略被放在合适的输出段中。选项’–unique’也可以影响这些段如何放置。
discard:不理会所有孤儿段,通过将他们放入’/DISCARD/’段,参见Output Section Discarding
warn:链接器按照place的策略放置,并且会提交一个警告。
error:如果检测到孤儿段则报错。
若未定义’–orphan-handling’选项,默认的选项为place。
–unique[=SECTION]
在输出文件中为每一个匹配的输入段创建独立的段,如果选项中的SECTION参数不存在,则应用于所有输入的孤儿段。可以多次使用这个命令;此命令防止输入的同名段合并,在链接脚本中重载输出的段声明。
-v / –version / -V
显示ld的版本号,-V选项还会lie
-x / –discard-all
删除所有局部(或者是本地,这里用的单词是local symbols)符号。
-X / –discard-locals
删除所有临时局部符号(符号通常有个与特定系统相关的前缀,典型的ELF系统是’.L’,或者传统的系统是’L’)。
-y symbol / –trace-symbol=symbol
打印每一个含有symbol指定符号的链接文件。此选项可以被重复使用。在很多系统中可能需要加上下划线。
如果链接中有个未定义符号,而又不知道符号从哪来时,此选项非常有用。
-Y path
为默认的库搜索路径增加一条路径。这个选项是为了跟Solaris兼容。
-z keyword
下表为支持的关键字:
关键字 | 功能 |
---|---|
combreloc | 组合多个重定位节,重新排布它们,使能动态符号查找缓存 |
defs | 禁止目标文件中存有未定义符号。但允许共享库中的未定义符号 |
execstack | 标明目标需要可执行的栈 |
global | 此选项仅在创建共享目标时有效。此命令使共享目标定义的符号可以被后续读取的库识别。 |
initfirst | 此选项仅在创建共享目标时有效。将共享目标标记为在所有目标初始化之前进行初始化。 同样的运行结束时,此目标将会在所有其他目标结束运行后结束。 |
interpose | 标记目标,使得目标的符号表在运行后先于其他所有符号被插入。 |
lazy | 生成一个可执行文件或者共享库时,此标记告诉动态链接器推迟函数的调用解析工作直到函数被调用的时刻而不是动态库加载的时刻。此选项也是默认选项。 |
loadfltr | 标记目标,使其过滤器在目标开始运行时立刻执行。 |
muldefs | 允许多次定义。 |
nocombreloc | 禁止多个可重用段组合。 |
nocopyreloc | 禁止链接器产生的.dynbss变量被用来替换共享库中定义的变量。可能会使动态代码进行重定位。 |
nodefaultlib | 使目标在搜索目标依赖时,会忽略默认的搜索路径。 |
nodelete | 使目标在运行时不能被卸载。 |
nodlopen | 使目标不能被dlopen打开(动态连接库加载函数)。 |
nodump | 使目标不能被dldump清空。 |
text | 将共享目标中的DT_TEXTREL当作错误。 |
notext | 不要将共享目标中的DT_TEXTREL当作错误。 |
textoff | 不要将共享目标中的DT_TEXTREL当作错误。 |
norelro | 不要在目标里创建ELF PT_GNU_RELRO段首部。 |
now | 当创建一个可执行共享库的时候,加一个标记告诉动态链接器在程序运行前或者被dlopen加载前需要把所有符号准备好,而不是推迟到函数被第一次调用的时候。。 |
origin | 标注目标可能含有$ORIGIN. |
relro | 在目标创建一个ELF的PT_GNU_RELRO段头部。 |
max-page-size=value | 将仿真器最大页大小设为value。 |
common-page-size=value | 将仿真器普通页大小设为value。 |
stack-size=value | 设置为0的话,会重载任何非0大小的PT_GNU_STACK段的创建。 |
bndplt | 总是在PLT实体前创建BND前缀。支持Linux/x86_64。 |
noextern-protected-data | 在构建共享库时,不要将保护数据符号作external处理。 此选项重载链接器后台默认选项。此命令可以被用来变通那些编译器生成的不正确的保护数据符号的重定位信息。对于共享库保护数据符号的更新不会对其他模块可见。支持i386和x86-64。 |
call-nop=prefix-addr,call-nop=prefix-nop,call-nop=suffix-nop,call-nop=prefix-byte,call-nop=suffix-byte | 当传输非直接调用到局部的函数,指定单字指令NOP的填充内容是foo,根据不同的GOT设置。 call-nop=prefix-addr 生成 0x67 call foo. call-nop=prefix-nop 生成 0x90 call foo. call-nop=suffix-nop 生成 call foo 0x90. call-nop=prefix-byte 生成 byte call foo. call-nop=suffix-byte 生成 call foo byte. 支持i386和x86_64。 |
其他关键字为与Solaris兼容而忽略.
-( archives -) / –start-group archives –end-group
archives为一个库文件列表。可以被显示指定或者使用’-l’选项。
被指定的库将会被重复搜索,直到没有新的未定义参数被创建。通常来说,一个库只会按照在命令行中列出来的顺序搜索一次。如果前面的库含有一个符号可以用来解决后面命令行中的库的符号,链接器做不到这一点。通过将库文件加组,他们将被重复搜索直到所有可能的引用都解决。
使用此选项会带来明显的性能下降。最好只用在不可避免的几个库循环引用的情况下。
–accept-unknown-input-arch / –no-accept-unknown-input-arch
告知链接器接受无法识别结构的输入文件。前提是假设用户知道他们在做什么并且仔细斟酌的希望链接这些未知的输入文件。在2.14版前这是链接器默认的行为。2.14开始的版本拒绝接受未知输入文件,因此’–accept-unknown-input-arch’选项添加进来以支持旧版本的行为。
–as-needed / –no-as-needed
此选项会影响之后的所有ELF动态库的DT_NEEDED标志。通常链接器会在每一个动态库中添加一个DT_NEEDED标志,无论库是否实际需要这个标志。–as-needed使得仅会在以下情况下标记到库中:
- 当链接器解决了一个普通目标文件的non-weak未定义符号
- 若库不在其他需要的库的DT_NEEDED列表中,一个non-weak未定义符号需要引用其他指定了需要的动态库。
出现在此命令控制的库后的目标文件和库不会影响对于是否添加标记的判断。这与从库中抽出目标文件的规则一致。–no-as-needed恢复默认选项。
–add-needed / –no-add-needed
此两个命令已经被废弃了,因为名字与–as-needed和–no-as-needed类似。现在的名字为–copy-dt-needed-entries / –no-copy-dt-needed-entries。
-assert keyword
此命令为了匹配SunOS,可以忽略。
-Bdynamic / -dy / -call_shared
连接动态链接库。这个仅仅在支持共享库的平台上有用.在这些平台上,这个选项通常是默认行为。这个选项的不同形式是为了跟不同的系统保持兼容。 你可以在命令行上多次使用这个选项:它影响紧随其后的’-l’ 选项的库搜索。
-Bgroup
在动态段的’DT_FLAGS_1’入口上设置’DF_1_GROUP’标志。这会让运行时链接器在处理在这个对象和它的相关部分时只在组中搜索。 ‘–unresolved-symbols=report-all’是隐式的。 这个选项只在支持共享库的ELF平台上有用。
-Bstatic / -dn/ -non_shared / -static
不连接共享库。 仅在支持共享库的平台上有用。这个选项的不同形式是为了跟不同的系统保持兼容。你可以在命令行上多次使用这个选项:它影响紧随其后的’-l’选项的库搜索。此选项也暗含了选项’–unresolved-symbols=report-all’。此选项可以和’-shared’选项一起用。这么做的意义是,一个共享库将被创建,但所有库的外部引用必须从静态库的入口拉取。
-Bsymbolic
创建共享库的时候,将全局符号的引用绑定到共享库的定义,如果有的话。通常,一个使用共享库链接的程序冲在共享库的定义是可能的。此选项仅在支持共享库的ELF平台上有用。
-Bsymbolic-functions
创建共享库的时候,将全局函数的引用绑定到共享库的定义,如果有的话。此选项仅在支持共享库的ELF平台上有用。
–dynamic-list=dynamic-list-file
为链接器指定动态列表的文件。通常,当创建共享库时,可以制定一个全局符号的列表,这些符号的引用不能被绑定到共享库的定义中。或者为可执行动态链接文件添加一个必须的符号表。此选项仅在支持共享库的ELF平台上有用。动态表的格式l类似于version node,但没有scope和node name。参考VERSION。
–dynamic-list-data
动态列表包含所有全局数据符号。
–dynamic-list-cpp-new
为C++运算符new和delete提供内建的动态列表。主要用来构建共享c++库(shared libstdc++)。
–dynamic-list-cpp-typeinfo
为C++运行时鉴定提供内建动态列表。
–check-sections / –no-check-sections
让链接器不要检查已分配的段的段地址是否重叠。通常链接器会进行此检查,如果有重叠将会产生相应的错误信息。此命令使链接器知道并允许段重叠。使用–check-sections恢复默认行为。通常不会检查重定位链接段重叠。可以使用–check-sections强制检查。
–copy-dt-needed-entries / –no-copy-dt-needed-entries
此选项影响那些被命令行提到的ELF动态库中的DT_NEEDED提到的动态库的处理方式。通常链接器不会向这些库的二进制输出中添加DT_NEEDED标志。在命令–copy-dt-needed-entries之后的动态库将会被添加DT_NEEDED实体。默认行为可用–no-copy-dt-needed-entries恢复。
此命令也会影响动态库中符号的分析。在–copy-dt-needed-entries命令下,命令中提到的动态库将会按照DT_NEEDED中提到的其他库递归搜索。默认的设置为搜索动态库后面的库的话,将会与动态库一起停止。没有DT_NEEDED链接将会转化为分析符号。
–cref
输出一个交叉引用表。如果一个链接映射文件正在被生成,交叉参照表将会被输出到映射文件中。否则,将会被输出到标准输出。
标的格式非常简单,因此如果需要,可以被一个脚本很容易的处理。符号被列印出来,按照名字排序。每个符号都有一个文件名列表。如果符号是被定义的,第一个文件是定义符号的文件。此后的文件为此符号出现的文件。最终任何引用此符号的文件都会被列出。
–no-define-common
这个选项抑制对普通符号的地址分配。脚本命令’INHIBIT_COMMON_ALLOCATION’具有同等的效果。参考Miscellaneous Commands。
此命令可以使得分配普通符号地址的策略与输出文件的格式分离;或者说,一个非重定向输出强制普通符号有地址。使用’–no-define-common’允许被共享库引用的普通符号仅在主程序中分配地址。这样就消除了共享库中未使用的重复空间,同时,也防止了在有多个指定了搜索路径的动态模块在进行运行时符号解析时引起的混乱。
–defsym=symbol=expression
在输出文件中建立一个全局符号,这个符号拥有一个EXPRESSION指定的绝对地址。你可以多次使用这个选项定义多个符号。EXPRESSION支持一个受限形式的算术运算:你可以给出一个十六进制常数或者一个已存在符号的名字,或者使用’+’和’-‘来加或减十六进制常数或符号。如果你需要更多的表达式,可以考虑在脚本中使用连接器命令语言(参考Assignments),注意在SYMBOL,=和EXPRESSION之间不允许有空格。
–demangle[=style] / –no-demangle
这些选项控制是否在错误信息和其它的输出中重组符号名。当连接器被告知要重组, 它会试图把符号名以一种可读的形式的展现:如果符号被以目标文件格式使用,它剥去前导的下划线,并且把C++形式的符号名转换成用户可读的名字。 不同的编译器有不同的重组形式。可选的重组形式参数可以被用来为你的编译器选择一个相应的重组形式。连接器会以缺省形式重组除非环境变量’COLLECT_NO_DEMANGLE’被设置。这些选项可以被用来重载缺省的设置。
-Ifile / –dynamic-linker=file
设置动态连接器的名字。这个只在产生动态连接的ELF可执行文件时有效。缺省的动态连接器通常是正确的;除非你知道你在干什么,不要使用这个选项。
–no-dynamic-linker
创建一个可执行文件时,忽略加载时的动态链接器的请求。此命令仅在含有动态重定位的ELF可执行文件中有效,通常还需要入口代码位置使重定位能够执行。
–fatal-warnings / –no-fatal-warnings
将所有警告当作错误。默认行为用–no-fatal-warnings恢复。
–force-exe-suffix
确认输出文件含有.exe后缀。
如果一个成功构建的输出文件没有.exe或者.dll后缀,此选项强迫链接器将输出文件复制到一个名字相同且含有.exe后缀的文件。此选项在把未修改的Unix makefiles使用在Microsoft Windows主机上时很有用,因为Windows的一些版本不会执行镜像,除非用.exe作为结尾。
–gc-sections / –no-gc-sections
允许对未使用的段使用垃圾收集。在不支持这个选项的目标上将被自动忽略。默认的行为可用’–no-gc-sections’恢复。注意垃圾收集支持COFF和PE目标,但此功能仅被当作实验性质。
‘–gc-sections’ 通过检查符号和重定位信息决定哪个段被操作。含有入口符号的段,所有含有未被命令行定义的符号的段,含有被动态目标引用符号的段将被保持。注意在建立共享库的时候,链接器必须假设任何可见符号都被引用了。一旦这个初始集合被决定好,链接器会递归标记那些被重定向引用的段。参考’–entry’ 和 ‘–undefined’
此选项可以在进行部分链接时设置(通过’-r’使能)。在此情况下,所有保存符号的根部必须显示的指出’–entry’或者’–undefined’选项,或者通过脚本文件的ENTRY命令指出。
–print-gc-sections / –no-print-gc-sections
列出所有被垃圾收集移除的段。列表会被显示在标准错误流。此命令仅会在–gc-sections使能了垃圾收集后才有意义。默认行为可以用’–no-print-gc-sections’恢复。
–print-output-format
打印默认输出的格式(可能被其他命令选项影响)。这可以是出现在脚本文件中OUTPUT_FORMAT命令中的字段。参考File Commands
–print-memory-usage
打印使用的空间,总大小和使用的大小通过MEMORY命令创建。此命令在嵌入式目标中很有用,可以快速察看空闲内存的总量。输出的格式为一个标题和每个区域一行。下面是一个例子:
Memory region Used Size Region Size %age Used
ROM: 256 KB 1 MB 25.00%
RAM: 32 B 2 GB 0.00%
–help
在标准输出上打印一个命令行选项概要,然后退出。
–target-help
打印一个所有目标平台相关的选项的概要,然后退出。
-Map=mapfile
打印一个连接位图到文件MAPFILE中. 参阅上面关于’-M’选项的描述。
–no-keep-memory
‘ld’通常会以速度优先于内存使用的方式优化程序,这是通过把输入文件的符号表放在内存缓冲中实现的, 这个选项告诉’ld’以内存使用优先来优化, 尽可能的减小符号表的重读。 这在’ld’在连接一个大文件时超出内存限制时有用
–no-undefined / -z defs
通常,当创建一个非符号共享库时,无定义的符号允许出现,并留待运行时连接器去解决。这个选项关闭这样的无定义符号的使用。开关’–[no-]allow-shlib-undefined’控制共享对象被连接进共享库时的行为。
–allow-multiple-definition / -z muldefs
通常,当一个符号被定义多次时,连接器会报告一个致命错误。这些选项允许重定义并且第一个定义被使用。
–allow-shlib-undefined / –no-allow-shlib-undefined
允许或不允许无定义符号存在于共享对象中。这个开关的类似’–no-undefined’,区别是这里只关注共享对象内的符号,而不管普通对象内部的符号。
默认的行为是如果创建可执行程序时共享库中含有未定义符号,会报告错误,但是在创建共享库的时候允许有未定义符号。
在链接共享库时允许未定义符号的原因是:
- 一个共享库在不同的链接中,可能在加载的时候会产生区别,因此符号可能在加载时实际解析。
- 有很多种操作系统,例如BeOS和HPPA,共享库中的未定义符号非常常见。
–no-undefined-version
通常当一个符号有一个未定义的版本时,连接器会忽略它。这个选项不允许符号有未定义的版本,并且碰到这种情况会报告一个严重错误。
–default-symver
为导出的未定义符号创建并使用一个默认符号版本(soname)。
–default-imported-symver
为导入的未定义符号创建并使用一个默认符号版本(soname)。
–no-warn-mismatch
通常, 如果你因为一些原因,企图把一些不匹配的输入文件连接起来的时候,’ld’会给出一个错误,可能这些文件是因为由不同的处理器编译或者拥有不同的大小端。这个选项告诉’ld’应当对这样的错误静默允许。这个选项必须小心使用。
–no-warn-search-mismatch
通常ld如果找到一个不合适的库,会给出警告,此选项静默警告。
–no-whole-archive
为后面的库关闭’–whole-archive’选项。
–noinhibit-exec
只要还能用,就保持可执行输出文件。通常在链接中如果出现错误链接器就不会产生输出文件;链接器遇到错误时会退出不会输出文件。
Retain the executable output file whenever it is still usable. Normally, the linker will not produce an output file if it encounters errors during the link process; it exits without writing an output file when it issues any error whatsoever.
-nostdlib
仅搜索显示指出的搜索地址。链接脚本指出的目录(包括命令行指出的链接脚本)被忽略。
–oformat=output-format
‘ld’可以被配置为支持多于一种的目标文件。如果你的’ld’以这种方式被配置,你可以使用’–oformat’选项来指定输出目标文件的二进制格式。就算’ld’被配置为支持多种目标格式,你通常也不必指定这个项,因为’ld’应当被配置为把最常用的输出格式作为默认格式。output-format是一个文本串,是被BFD库支持的一个特定格式的名字。脚本命令’ OUTPUT_FORMAT’也可以指定输出格式,但这个选项可以重载它。参考BFD
-pie / –pic-executable
创建位置独立执行文件。目前仅支持ELF平台。位置独立执行文件与共享库相似,他们都被操作系统的动态链接器重定位到虚地址。像普通动态链接可执行文件,他们也可以执行,且在执行文件中定义的符号不会被共享库覆盖。
-qmagic
这个选项被忽略,只是为了跟Linux保持兼容。
-Qy
这个选项被忽略,只是为了跟SVR4保持兼容。
–relax / –no-relax
此命令与一些目标有关:
参考 ld and the H8/300
参考 ld and the Intel 960 family
参考 ld and Xtensa Processors
参考 ld and the 68HC11 and 68HC12
参考 ld and the Altera Nios II
参考 ld and PowerPC 32-bit ELF Support.
都可在Machine Dependent Features中找到。
在不支持’–relax’的平台命令被自动忽略。
在支持’–relax’的平台’–no-relax’命令可以关闭此特性。
–retain-symbols-file=filename
只保留在filename中列出的那些符号,丢弃所有其他的。FILENAME是一个简单地平坦模式文件, 一个符号占一行。这个选项在那些会逐步积累起一个大的全局符号表的系统中(比如 VxWorks)会很有用,它能有效地节约内存空间。
‘–retain-symbols-file’不丢弃未定义的符号,和需要重定位的符号.。
你可能在命令行上只指定’–retain-symbol-file’一次,它覆盖’-s’和’-S’的功能。
-rpath=dir
为运行时库的搜索路径增加一个目录。这个在连接带有共享库的ELF可执行文件时使用。’-rpath’的所有参数会被连接起来传递给运行时连接器, 运行时连接器在运行时用它们定位共享对象。’-rpath’在定位被链接中显示包含的共享目标所需要的共享目标也很有用;参阅关于’-rpath-link’选项的描述, 如果在连接一个ELF可执行文件时不使用’-rpath’选项,环境变量’LD_RUN_PATH’选项就会被使用。
‘-rptah’选项也可以使用在SunOS上。缺省地,在SunOS上,连接器会从所有的’-L’选项中形成一个运行时搜索路径。如果使用了’-rpath’选项,那运行时搜索路径就只从’-rpath’选项中得到,忽略’-L’选项。这在使用GCC时非常有用, 它会用上很多的’-L’选项,而这些路径很可能就是NFS挂上去的文件系统中。
为了同其他ELF的连接器兼容,如果’-R’选面后面跟有一个目录名,而不是一个文件名,那它也会被处理成’-rpath’选项。
-rpath-link=dir
当在SunOS上使用ELF时,一个共享库可能会用到另一个共享库。当’ld-share’把一个共享库作为一个输入文件连接时就有可能发生这种情况。
当一个连接器在链接非共享,不可重定位连接时,如果遇上这种依赖情况,它会自动定位需要的共享库,然后把它包含在连接中,如果在这种情况中,它没有被显式包含, 那’-rpath-link’选项指定优先搜索的一组路径名,或者是分隔开的文件名,或者是重复出现的’-rpath-link’命令。
这个选项必须小心使用,因为它会覆盖那些可能已经被编译进共享库中的搜索路径. 在这种情况下,它就有可能无意中使用一个不同的搜索路径。
连接器使用下面的搜索路径来定位需要的共享库:
- 所有由’-rpath-link’选项指定的搜索路径.
- 所有由’-rpath’指定的搜索路径。’-rpath’跟’-rpath_link’的不同之处在于,由’-rpath’指定的路径被包含在可执行文件中,并在运行时使用, 而’-rpath-link’选项仅仅在连接时起作用。这种-rpath搜索只用于本地连接器以及使用了–with-sysroot的交叉编译器。
- 在一个ELF系统中,对本地链接器来说,如果’-rpath’和’rpath-link’选项没有被使用, 会搜索环境变量’LD_RUN_PATH’的内容。
- 在SunOS上, 若不用’-rpath’选项,只搜索所有由’-L’指定的目录。
- 对于一个本地连接器,环境变量’LD_LIBRARY_PATH’的内容被搜索。
- 对于一个本地ELF连接器,共享库中的’DT_RUNPATH’和’DT_RPATH’操作符会被需要它的共享库搜索。如果’DT_RUNPATH’存在了,那’DT_RPATH’就会被忽略。
- 缺省目录, 通常为’/lib’和’/usr/lib’。
- 对于ELF系统上的本地连接器,如果文件’/etc/ld.so.conf’存在,这个文件中有的目录会被搜索。
如果需要的共享库没有被找到,那连接器会发出一条警告信息,并继续执行链接。
-shared / -Bshareable
创建一个共享库,此命令仅在ELF,XCOFF,SunOS平台有效。在SunOS,如果没有使用-e选项且链接时有未定义的符号,链接器会自动创建一个共享库。
–sort-common / –sort-common=ascending / –sort-common=descending
这个选项告诉’ld’当它把普通符号放到相应的输出段中时按大小进行排序。符号对齐要考虑是十六字节或者更大,八字节,四字节,二字节,单字节。这是为了避免因为对齐约束而在符号间产生的断裂。若未特别指定顺序,会采用下降顺序。
–sort-section=name
此命令将会在所有脚本内符合通配符模板的段上执行SORT_BY_NAME。
–sort-section=alignment
此命令将会在所有脚本内符合通配符模板的段上执行SORT_BY_ALIGNMENT。
–split-by-file[=size]
与’–split-by-reloc’相似,但在到达SIZE时,为每一个输入文件创建一个新的输出段。SIZE默认值为1。
–split-by-reloc[=count]
试图在输出文件中创建额外的段,这样就没有单个的输出段含有多于COUNT个重定位符。这在产生巨大的用于COFF格式的实时内核的可重定位文件时非常有用;因为COFF不能在一个段中表示多于65535个重定位。注意,这在不支持任意段的目标文件格式中会失败,链接器不会分割独立的输入段来进行重分配,所以,如果独立输入段含有多于COUNT个重定位符,那一个输出段会含有同样多的可重定位符。COUNT缺省被设为32768。
–stats
计算并显示关于链接器操作的统计信息, 比如执行时间,内存占用等。
–sysroot=directory
把directory当作sysroot,覆盖编译时的默认值。此命令仅支持设置了使用–with-sysroot配置的链接器。
–traditional-format
对于某些目标平台,’ld’的输出会跟某些此前有的连接器的输出有所不同。这个开关要求’ld’使用传统的格式。
例如,在SunOS系统,ld合并符号字符表中重复的入口。这样可以减少输出文件大约30%的容量。不幸的是,SunOS的dbx程序不能读取生成的程序(gdb没问题)。’–traditional-format’告诉ld不要合并重复的入口。
–section-start=sectionname=org
通过指定ORG, 指定段在输出文件中的绝对地址。你可以多次使用这个选项来定位多个段。ORG必须是一个十六进制整数;为了跟其他的连接器兼容,你可以忽略前导’0x’。注意,在sectionname,等号,ORG之间不允许有空格出现。
-Tbss=org / -Tdata=org / -Ttext=org
类似–section-start,而默认.bss, .data或.text为他们的sectionname。
-Ttext-segment=org
创建ELF可执行文件的时候,此命令会设置代码段第一个字节的地址。
-Trodata-segment=org
在创建一个含有只读数据单独保存一个段而不是代码段中的ELF可执行程序或者共享目标时,此命令会设置只读数据段的第一个字节的地址。
-Tldata-segment=org
在为x86-64中等规模内存模型创建一个ELF可执行或者共享文件的时候,此选项会设置ldata段第一个字节的地址。
–unresolved-symbols=method
决定如何处理未解析的符号:
方法 | 说明 |
---|---|
ignore-all | 不报告任何未解析的符号。 |
report-all | 报告所有未解析的符号。默认选项。 |
ignore-in-object-files | 仅报告共享库中的未解决符号,常规目标的不管 |
ignore-in-shared-libs | 仅报告常规目标中的未解决符号,共享库的不管。 创建动态二进制文件时,如果知道所有动态库需要的符号引用都被链接命令包含了,此命令就很有用。 |
共享库自身的行为也可以被’–[no-]allow-shlib-undefined’命令控制。
通常链接器碰到不能解析的符号都会抱错,但选项–warn-unresolved-symbols可以将其转变为警告信息。
–dll-verbose / –verbose[=NUMBER]
显示’ld’的版本号,并列出支持的连接器模拟。显示哪些输入文件能被打开,而哪些不能。显示连接器使用的连接脚本。如果可选NUMBER参数大于1,额外的符号信息也会显示。
–version-script=version-scriptfile
指定连接器的脚本的版本名。这个常在创建一个需要指定附加的关于版本层次的信息的共享库时使用,这个选项只有支持共享库的ELF平台上有效。参见VERSION。此命令在PE平台被部分支持,可以使用version脚本在自动导出模式过滤符号的可见性:脚本中任何符号标记为’local’的都将被禁止导出。参见Machine-Dependent中的’win32’。
–warn-common
当一个普通符号跟另一个普通符号或符号定义合并起来时产生警告。类Unix连接器允许这个选项,有时比较实用,但是在其他的操作系统上的连接器不允许。这个选项可以让你在合并全局符号时发现某些潜在的问题。不幸的是,有些C库使用这项特性,所以你可能会像在你的程序中一样,在库中得到一些警告信息。
这里有三种用C语言说明的全局符号:
- ‘int i = 1;’一个定义,将会放到输出文件的已初始数据段。
- extern int i;’一个未定义引用,因此不会分配空间。必须在某个地方有一个此变量的定义或者普通符号。
- ‘int i;’一个普通符号。如果变量仅有(一个或多个)普通符号,它将进入输出文件的未初始化数据区域。链接器合并同一个变量的重复普通符号为一个符号。如果符号大小不同,链接器会选择最大的那个。如果变量拥有相似的定义,链接器将一个普通符号转变为声明。
‘–warn-common’可以产生五种警告,美中警告由两行组成:第一行描述刚刚遭遇的符号,第二行描述此前碰到的同名符号。一个或者两个这些符号可能是一个普通符号。
1.符号已经有一个定义,把一个普通符号转化为一个引用。
file(section): warning: common of `symbol'
overridden by definition
file(section): warning: defined here
2.把一个普通符号转化为一个引用,因为遇到了第二个关于符号的定义。这跟前一种情况相同,除了符号遇到的顺序相反。
file(section): warning: definition of `symbol'
overriding common
file(section): warning: common is here
3.把一个普通符号跟前一个相同大小的普通符号合并。
file(section): warning: multiple common
of `symbol'
file(section): warning: previous common is here
4.把一个普通符号跟前一个更大的普通符号合并。
file(section): warning: common of `symbol'
overridden by larger common
file(section): warning: larger common is here
5.把一个普通符号跟前一个更小的普通符号合并. 这跟前一种情况相同, 除了遇到的符号的顺序不同。
file(section): warning: common of `symbol'
overriding smaller common
file(section): warning: smaller common is here
–warn-constructors
如果全局构造函数被使用则发出警告。仅有几个目标文件格式支持此命令。例如COFF和ELF格式,链接器无法探测到使用全局构造函数。
–warn-multiple-gp
如果输出文件请求了多个全局指针则发出警告。仅在一些特定的处理器有意义,例如Alpha。特别来说,一些处理器把巨大数值的常数存在一个特殊段。一个特殊寄存器(全局指针)指向此段中间的部分,如此常量可以通过基地址相关的寻址模式被快速的获得。鉴于基寄存器中的偏移地址是固定的且相对较小(例如16位),这将限制常量池的大小。因此在大型程序中,通常需要多重的全局指针值来对所有可能的常量进行寻址。此命令在这种情况下会产生警告。
–warn-once
对于每个未定义符号仅警告一次,而不是每次模块引用到。
–warn-section-align
警告是否一个输出段的地址为了对齐而被改变。典型的来说,输入段会设置对齐。地址仅在未显示指明的情况下才会改变。例如,SECTIONS命令没有制定一个段的启示地址。(参考SECTIONS)
–warn-shared-textrel
如果链接器向共享目标添加DT_TEXTREL则报警。
–warn-alternate-em
如果目标含有可替换的ELF机器码则报错。
–warn-unresolved-symbols
若链接器报告一个不能解析的符号(参考–unresolved-symbols),通常会报错,此命令让其产生一个警告。
–error-unresolved-symbols
此命令恢复链接器的默认行为,当有不能解析符号时产生错误。
–whole-archive
对于每一个在命令行中’–whole-archive’选项后面出现的库文件,在连接中包含档案文件中的所有目标文件,而不是为需要的目标文件搜索库文件。这在把一个库文件转化为一个共享库时使用,把所有的目标放到最终的共享库中. 这个选项可以被多次使用。
在GCC中使用这个选项需要注意两点:
首先,GCC不知道这个选项,所以,你必须使用’-Wl, -whole-archive’.
第二, 不要忘了在你的库文件列表的后面使用’-Wl,-no-whole-archive’,因为GCC会把它自己的库列表加到你的连接后面,而这可能并不是你所预期的。
–wrap=symbol
为一个符号使用包装函数。任何未定义的对符号的引用会被解析为’ __wrap_symbol’。任何未定义的’__real_symbol’的引用将被解析为符号。
此命令可以用来为系统函数提供包装。包装函数需会用__wrap_symbol调用,而如果希望使用系统函数,应该调用__real_symbol。
下面是一个小例子:
void *
__wrap_malloc (size_t c)
{
printf ("malloc called with %zu\n", c);
return __real_malloc (c);
}
如果在链接此文件与其他代码时使用了’–wrap malloc’命令,则所有调用malloc的命令将会调用__wrap_malloc作为替代。而 __wrap_malloc中的__real_malloc将会调用真正的函数。
你可能希望提供一个自己的__real_malloc,这样在不用–wrap选项的时候编译也能成功。如果你这么做了,不要把__real_malloc的定义放在与__wrap_malloc同一个文件中,如果你这么做了,编译器可能会在链接器有机会将其包装前就给解析成malloc了。
–eh-frame-hdr
请求创建.eh_frame_hdr段和ELF的PT_GNU_EH_FRAME段头部。
–no-ld-generated-unwind-info
请求向链接器创建PLT代码段一样创建.eh_frame的unwind信息。如果链接器支持unwind创建信息,则此选项为默认选项。
–enable-new-dtags / –disable-new-dtags
连接器可以在ELF中创建一个新的动态标签。但是旧的ELF系统可能不理解这个。如果指定了’–enable-new-dtags’,动态标签会按需要被创建,且旧的动态标签将被忽略。如果指定了’–disable-new-dtags’,那不会有新的动态标签被创建。缺省地,新的动态标签不会被创建。注意这些选项只在ELF系统中有效。
–hash-size=number
设置默认的链接器的哈希表的大小为一个number的近似值。增加这个数的大小可以减少链接器执行任务的时间长度,代价是增加了链接器需要的内存空间。减少此值可以减少内存需求,代价是花费更多的时间。
–hash-style=style
设置链接器的哈希表类型.类型可以为经典的ELF的。hash段sysv,或者新的GUN风格.gnu.hash段gnu,或者两种都采用。默认为sysv。
–compress-debug-sections=none / –compress-debug-sections=zlib / –compress-debug-sections=zlib-gnu / –compress-debug-sections=zlib-gabi
在ELF平台上,这些选项控制如何使用zlib压缩DWARF debug段。–compress-debug-sections=none不压缩。–compress-debug-sections=zlib-gnu压缩DWARF段并更改段名称为’.zdebug’用来替代’.debug’。
–compress-debug-sections=zlib和–compress-debug-sections=zlib-gabi使用ELF ABI的SHF_COMPRESSED压缩DWARF。默认行为取决于相关的目标以及构造工具链的设置选项。默认输出行为可以通过检查链接器的–help选项获得。
–reduce-memory-overheads
此选项减少ld运行时需要的内存,而代价是降低速度。这是因为使用旧式的O(n^2)算法生成映射文件,而不是新的O(n)算法,但要花费大约40%额外的内存用来存储符号。
另一个影响是使默认的哈希表大小变为1021,这同样可以节省内存同时增加执行时间。如果使用了–hash-size,这部分就不会被改变。
–reduce-memory-overheads在将来的链接器版本可能会被用来进行更多的功能。
–build-id / –build-id=style
请求建立一个.note.gnu.build-id的ELF纪录段,或者.buildid的COFF段。纪录的内容为独一的链接文件的标识位。style可以是使用128位随机的uuid,sha1对普通输出部分使用160位的SHA1哈希,md5使用128位的MD5哈希,或者0xhexstring。如果忽略style则使用sha1。
md5和sha1创建的识别号在同样的输出文件中总会保持一致,但在不同的输出文件中不会相同。一个链接文件可能被其他工具所改变,但build ID标记的原始文件不会改变。
传递空的style将会使前面的–build-id选项失效。