资源描述
标 题: GLD中文手册--前言
前段时间从天天十多个小时的工作时间中挤出那么点时间完毕了NASM手册的翻译,之后得到了汇编版很多朋友的支持与关心,心中非常感激。
但是我们知道,NASM只是一个汇编器,只有它我们还无法完毕我们的工作,NASM功能很强大,能生成很多目的格式的文献,但是得不到我们最终想要的可执行文献。对,我们还需要一个连接器。
可供选择的连接器有很多,它们当中也有很多是免费的,这在NASM的手册中也有介绍,这里我选择的是GNU的连接器ld,为了能更好地使用这个工具,就有了这篇翻译文档。
请不要误会,gld并不只能运营在unix/linux系统下面。GCC的windows版本djgpp带有ld的windows版本,可以通过互联网免费下载。
希望这篇文档能对大家有所帮助,谢谢。
标 题: GLD中文手册--(一)
使用ld
********
本文档介绍GNU连接器ld的2.14版本.
本文档在GNU自由文档许可证下发行.在"GNU自由文档许可证"一章中有关于本许可证的一份拷贝.
概述
********
'ld'把一定量的目的文献跟档案文献连接起来,并重定位它们的数据,连接符号引用.一般,在编译一个程序时,最后一步就是运营'ld'.
'ld'能接受连接命令语言文献,这是一种用AT&T的连接编辑命令语言的超集写成的文献,用来在连接的整个过程中提供显式的,全局的控制.
本版本的'ld'使用通用BFD库来操作目的文献.这就允许'ld'读取,合并,写入目的文献时,可以使用各种不同的格式,比如,COFF或'a.out'. 不同的格式可以被连接到一起产生一个有效的目的文献.
除了它的灵活性,GNU连接器比其它连接器更有用的地方在于它提供了诊断信息. 许多连接器在碰到一个错误的时候立即放弃执行;但'ld'却可以继续执行,以让你发现其他的错误(或者,在某些情况下,得到一个带有错误的输出文献)
引用
**********
GNU连接器'ld'可以解决大量的不同情况,并且跟其他的连接器保持尽也许的兼容.这样,你就拥有更多的选择来控制它的行为.
命令行选项
====================
连接器提供大量的命令行选项,但是,在实际使用中,只有少数被经常使用.比如,'ld'的一个经常的使用场合是在一个标准的Unix系统上连接标准的Unix目的文献.在这样的一个系统上,连接文献'hello.o'如下:
ld -o OUTPUT /lib/crt0.o hello.o -lc
这告诉'ld'产生一个叫OUTPUT的文献,作为连接文献'/lib/crt0.o'和'hello.o'和库'libc.a'的结果.'libc.a'来自标准的搜索途径.(参阅下文的关于'-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连接器接受的常用命令行开关的一个列表:
`-aKEYWORD'
这个选项在HP/UX兼容系统上被支持. 参数KEYWORD必须是下面字符串中的一个 :`archive', `shared', or `default'. `-aarchive'在功能上跟 `-Bstatic'相同,而此外两个关键字功能上跟`-Bdynamic'相同. 这个选项可 被多次使用.
`-AARCHITECTURE'
`--architecture=ARCHITECTURE'
在最近发行版本的'ld'中,这个选项只在Intel 960系列架构上有用. 在那种'ld'配置中,参数ARCHITECTURE拟定960系列的某一特定架构,启用某些安全措施,并修改档案库的搜索途径.
将来的'ld'发行版也许为其它架构系列支持相似的功能.
`-b INPUT-FORMAT'
`--format=INPUT-FORMAT'
'ld'可以被配置为支持多于一种的目的文献.假如你的'ld'以这种方式被配置,你可以使用'-b'选项为输入目的文献指定二进制格式. 就算'ld'被配置为支持可选目的格式,你不必经常指定这一项,由于'ld'被配置为在每一台机子上把最常用的格式作为默认输入格式. INPUT-FORMAT是一个字符串,
你也许在连接一个不常用的二进制格式文献时需要这个参数.你也可使用'-b'来显式切换格式(在连接不同格式的目的文献时),方法是在每一组特定格式的目的前使用'-b INPUT-FORMAT'.
缺省的格式是从环境变量'GNUTARGET'中得到的.你也可以从一个脚本中定义输入格式,使用的命令是'TARGET'.
`-c MRI-COMMANDFILE'
`--mri-script=MRI-COMMANDFILE'
为了跟MRI生产的连接器兼容,'ld'接受另一种用受限命令语言写成的脚本文献,通过选项'-c'引入MRI脚本文献;使用'-T'选项是运营用普通'ld'脚本语言写的连接脚本.假如MRI-CMDFILE不存在,'ld'在'-L'指定的目录中寻找.
`-d'
`-dc'
`-dp'
这三个选项是等价的; 多字符形式是为了跟其他连接器兼容才被支持的.它们给普通符号分派空间,即使一个重定位输出文献已经被指定(通过'-r'). 脚本命令`FORCE_COMMON_ALLOCATION'具有同样的效果.
`-e ENTRY'
`--entry=ENTRY'
使用符号ENTRY作为你的程序的开始执行点,而不是使用缺省的进入点.假如没有叫做ENTRY的符号,连接器会企图把ENTRY作为一个数字进行分析,并使用它作为入口地址(数字会被解释为10进制的;你可以使用前导的'0x'强制为16进制,或'0'作为8进制.)
`-E'
`--export-dynamic'
当创建一个动态连接的可执行程序时, 把所有的符号加到动态符号表中.动态符号表是一个符号集,这些符号对于运营时的动态对象是可见的.
假如你不使用这个选项,动态符号表中就会只具有那些连接进来的动态对象中用到的符号
假如你使用'dlopen'来载入动态对象,它需要引用程序中的符号,那你也许需要在连接程序时用到这个选项.
你也可以使用版本脚本来控制哪些符号应当被加到动态符号表中.
`-EB'
连接big-endian对象. 这会影响缺省输出格式.
`-EL'
连接little-endian对象. 这会影响缺省输出格式.
`-g'
忽略. 为了跟其它工具兼容而提供.
`-i'
执行一个增量连接(跟'-r'等同)
`-init NAME'
当创建一个ELF可执行文献或共享对象时,当可执行文献或共享对象被加载时,调用NAME, 这是通过把DT_INIT设立成函数的地址实现的. 缺省情况下,连接器使用'_init'作为调用的函数.
`-lARCHIVE'
`--library=ARCHIVE'
增长一个档案文献ARCHIVE到连接的文献列表中.这个选项可以被多次使用. 'ld'会为每一个指定的ARCHIVE搜索它的途径列表,寻找`libARCHIVE.a'
对于支持共享库的系统, 'ld'也许还会搜索扩展名不是'.a'库.特别的,在ELF和SunOS系统上,'ld'会在搜索带有'.a'扩展名的库前搜索带'.so'扩展名的库.
`-M'
`--print-map'
打印一个连接位图到标准输出.一个连接位图提供的关于连接的信息有如下一些:
* 目的文献和符号被映射到内存的哪些地方.
* 普通符号如何被分派空间.
* 所有被连接进来的档案文献,尚有导致档案文献被包含进来的那个符号.
`-n'
`--nmagic'
关闭所有节的页对齐,假如也许,把输出格式标记为'NMAGIC'.
`-N'
`--omagic'
把text和data节设立为可读写.同时,取消数据节的页对齐,同时,取消对共享库的连接.假如输出格式支持Unix风格的magic number, 把输出标志为'OMAGIC'.
`--no-omagic'
这个选项执行的操作大部分正好跟'-N'相反.它设立text节只读,强制data节页对齐. 但是,这个选项并不启动连接共享库的功能. 使用'-Bdynamic'启动这个功能.
`-o OUTPUT'
`--output=OUTPUT'
使用OUTPUT作为'ld'产生的程序的名字;假如这个选项没有指定,缺省的输出文献名是'a.out'.脚本命令'OUTPUT'也可以被用来指定输出文献的文献名.
`-O LEVEL'
假如LEVEL是一个比0大的数值, 'ld'优化输出.这也许会明显多占用时间,所以只有在生成最后的文献时使用.
`-q'
`--emit-relocs'
把重定位节和内容留在完全连接后的可执行文献中. 连接分析和优化工具也许需要这些信息用来进行对的的修改与执行. 这在大的可执行文献中有用.
这个选项目前只支持ELF平台.
`-r'
`--relocateable'
产生可重定位的输出, 比如,产生一个输出文献它可再次作为'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'的缺省连接脚本(而不是增长它的内容),所以命令文献必须指定所有需要的东西以精确描述输出文献.假如SCRIPTFILE在当前目录下不存在,'ld'会在'-L'选项指定的所有目录下去寻找.多个'-T'选项会使内容累积.
`-u SYMBOL'
`--undefined=SYMBOL'
强制SYMBOL在输出文献中作为一个无定义的符号被输入.这样做会有一些效果,比如,会引发从标准库中连接更多的模块. '-u'可以以不同的参数反复使用,以输入多个无定义的符号.这个选项跟连接脚本命令中的'EXTERN'是等效的.
`-Ur'
对于不是C++的程序,这个选项跟'-r'是等效的: 它产生可重定位的输出,比如,一个输出文献它可以再次作为'ld'的输入. 当连接C++程序时,'-Ur'解析构造 函数的引用,跟'-r'不同. 但假如在一些用'-Ur'连接过的文献上再次使用 '-Ur',它不会工作,由于一旦构造函数表被建立,它不能被添加内容.请只在最后一遍连接的时候使用'-Ur', 对其它的,只使用'-r'.
`--unique[=SECTION]'
对于所有匹配SECTION的输入节,在输出文献中都各自创建单独的节,或者,假如可选的通配符SECTION参数丢失了,为每一个孤儿输入节创建一个输出节. 一个孤儿节是一个连接脚本中没有指定的节.你可以在命令行上多次使用这个选项; 阻止对同名输入节的合并,在连接脚本中重载输出节分派.
`-v'
`--version'
`-V'
显示'ld'的版本. '-V'选项同时会列出支持的模拟器.
`-x'
`--discard-all'
删除所有的本地符号.
`-X'
`--discard-locals'
删除所有的临时本地符号.对于大多数目的平台,就是所有的名字以'L'开头的本地符号.
`-y SYMBOL'
`--trace-symbol=SYMBOL'
打印出所有SYMBOL出现的被连接文献的名字. 这个选项可以被多次使用. 在很多系统中,这在预先拟定底线时很有必要.
当你拥有一个未定义的符号,但不知道这个引用出自哪里的时候,这个选项很有用.
`-Y PATH'
为缺省的库搜索途径增长一条途径.这个选项是为了跟Solaris兼容.
`-z KEYWORD'
能被辨认的关键字涉及'initfirst', 'interpose', 'loadfltr', `nodefaultlib', `nodelete', `nodlopen', `nodump', `now', `origin',`combreloc', `nocombreloc' and `nocopyreloc'. 为了跟 Solaris兼容,所有其它的关键字都被忽略. 'initfirst'标志一个对象,使它在运营时,在所有其他对象之前被初始化. 'interpose'标志一个对象,使它的符号表放在所有其他符号之前,作为重要的执行者. 'loadfltr'标志一个对象,使它的过滤器在运营时立即被解决.'nodefaultlib'标志一个对象,使在搜索本对象所依赖的库时,忽略所有缺省库搜索途径. 'nodelete'标志一个对象,使它在运营时不会被从内存中删除.'nodlopen'标志一个对象,使这个对象不可以通过'dlopen'载入.'nodump'标志一个对象,使它不能被'dldump'转储. 'now'标志一个对象,使它成为非懒惰运营时绑定对象. 'origin'标志一些也许具有$ORIGIN的对象,'defs'不允许无定义符号. 'muldefs'允许重定义. 'comberloc'组合多个重定位节,重新排布它们,让动态符号可见. 'nocomberloc'使多个重定位节组合无效. 'nocopyreloc'使重定位拷贝后的结果无效.
--
标 题: GLD中文手册--(二)
`-( 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'选项被用来恢复旧的行为.
`-assert KEYWORD'
这个选项被忽略,只是用来跟SunOS保持兼容.
`-Bdynamic'
`-dy'
`-call_shared'
连接动态链接库. 这个仅仅在支持共享库的平台上有用.在这些平台上,这个选项通常是默认行为. 这个选项的不同形式是为了跟不同的系统保持兼容. 你可以在命令行上多次使用这个选项:它影响紧随其后的'-l'选项的库搜索.
`-Bgroup'
在动态节的'DT_FLAGS_1'入口上设立'DF_1_GROUP'标志.这会让运营时连接器在解决在这个对象和它的相关部分搜索时只在组中. '--no-undefined'是隐式的. 这个选项只在支持共享库的ELF平台上有用.
`-Bstatic'
`-dn'
`-non_shared'
`-static'
不连接共享库. 这个仅仅在支持共享库的平台上有用. 这个选项的不同形式是为了跟不同的系统保持兼容. 你可以在命令行上多次使用这个选项:它影响紧随其后的'-l'选项的库搜索.
`-Bsymbolic'
当创建一个共享库时, 把对全局符号的引用绑定到共享库中的定义(假如有),通常, 一个连接共享库的程序重载共享库中的定义是也许的. 这个选项只在支持共享库的ELF平台上有用.
`--check-sections'
`--no-check-sections'
让连接器在节地址被分派后不要去检查节地址是否重叠.通常,连接器会执行这种检查,假如它发现了任何重叠,它会产生相应的错误信息. 连接器知道也允许节的重叠. 缺省的行为可以使用命令行开关`--check-sections'来恢复.
`--cref'
输出一个交叉引用表. 假如一个连接器位图文献被产生, 交叉引用表被打印到位图文献. 否则, 它被打印到标准输出.
表的格式相称的简朴, 所以,假如需要,可以通过一个脚本很容易地解决它. 符号是以名字被打印输出,存储. 对于每一个符号,给出一个文献名列表. 假如符号被定义了, 列出的第一个文献是符号定义的所在. 接下来的文献包含符号的引用.
`--no-define-common'
这个选项限制对普通符号的地址分派. 脚本命令`INHIBIT_COMMON_ALLOCATION'具有同等的效果.
`--no-define-common'选项允许从输出文献的类型选择中拟定对普通符号的地址分派; 否则, 一个非重定位输出类型强制为普通符号分派地址. 使用'--no-define-common'允许那些从共享库中引用的普通符号只在主程序中被分派地址. 这会消除在共享库中的无用的副本的空间, 同时,也防止了在有多个指定了搜索途径的动态模块在进行运营时符号解析时引起的混乱.
`--defsym SYMBOL=EXPRESSION'
在输出文献中建立一个全局符号,这个符号拥有一个EXPRESSION指定的绝对地址. 你可以多次使用这个选项定义多个符号. EXPRESSION支持一个受限形式的算术运算:你可以给出一个十六进制常数或者一个已存在符号的名字,或者使用'+'和'-'来加或减十六进制常数或符号. 假如你需要更多的表达式,可以考虑在脚本中使用连接器命令语言, 注旨在SYMBOL,=和EXPRESSION之间不允许有空格.
`--demangle[=STYLE]'
`--no-demangle'
这些选项控制是否在错误信息和其它的输出中重组符号名. 当连接器被告知要重组, 它会试图把符号名以一种可读的形式的展现: 假如符号被以目的文献格式使用,它剥去前导的下划线,并且把C++形式的符号名转换成用户可读的名字.
不同的编译器有不同的重组形式. 可选的重组形式参数可以被用来为你的编译器选择一个相应的重组形式. 连接器会以缺省形式重组直至环境变量`COLLECT_NO_DEMANGLE'被设立. 这些选项可以被用来重载缺省的设立.
`--dynamic-linker FILE'
设立动态连接器的名字. 这个只在产生动态连接的ELF可执行文献时有效. 缺省的动态连接器通常是对的的; 除非你知道你在干什么,不要使用这个选项.
`--embedded-relocs'
这个选项只在连接MIPS嵌入式PIC代码时有效, 这些代码必须是由GNU的编译器跟汇编器通过-membedded-pic选项生成的. 它导致连接器产生一个表,这个表被用来在运营时重定位所有的被静态初始化为指针值的数据.
`--fatal-warnings'
把所有的警告视为错误.
`--force-exe-suffix'
保证输出文献有一个.exe后缀.
假如一个被成功完整连接的输出文献不带有一个'.exe'或'.dll'后缀, 这个选项保证连接器把输出文献拷贝成带有'.exe'后缀的同名文献. 这个选项在使用微软系统来编译未经修改的Unix的makefile时很有用, 由于有些版本的 windows不会运营一个不带有'.exe'后缀的映像.
`--no-gc-sections'
`--gc-sections'
允许对未使用的输入节的碎片收集. 在不支持这个选项的平台上,被忽略. 这个选项不能跟 '-r'选项共存也不能被用来进行动态连接. 缺省行为可以用 `--no-gc-sections'进行恢复.
`--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',这里只关注共享对象. 这样,假如'--no-undefined'被设 置,但'--no-allow-shlib-undefined'未被设立, 连锁反映是存在于规则对象文献中的无定义的符号会引起一个错误,但是在共享对象中的未定义的符号会被忽略.
把`--allow-shlib-undefined'设立为缺省的因素是在连接时指定的共享对象并不一定是载入时可载入的那个,所以,符号也许要到载入时间才被解析.
`--no-undefined-version'
通常当一个符号有一个未定义的版本时,连接器会忽略它. 这个选项不允许符号有未定义的版本,并且碰到这种情况,会报告一个严重错误.
`--no-warn-mismatch'
通常, 假如你由于一些因素,企图把一些不匹配的输入文献连接起来的时候, 'ld'会给出一个错误,也许这些文献是由于由不同的解决器编译. 这个选项告诉'ld'应当对这样的错误默认允许. 这个选项必须小心使用.
`--no-whole-archive'
为后面的档案文献关闭'--whole-archive'选项的影响.
`--noinhibit-exec'
当一个可执行文献还可以使用时,就保存它. 通常,连接器假如在连接过程中遇 到了错误,就不会产生输出文献;当它遇上错误时,它会退出而不写输出文献.
`-nostdlib'
仅搜索那些在命令行上显式指定的库途径. 在连接脚本中(包含在命令行上指定的连接脚本)指定的库途径都被忽略.
`--oformat OUTPUT-FORMAT'
'ld'可以被配置为支持多于一种的目的文献. 假如你的'ld'以这种方式被配置,你可以使用'--oformat'选项来指定输出目的文献的二进制格式.就算'ld'被配置为支持多种目的格式,你也不必指定这个项,由于'ld'应当被配置为把最常用的输出格式作为默认格式. OUTPUT-FORMAT是一个文本串,是被BFD库支持的一个特定格式的名字.脚本命令'OUTPUT_FORMAT'也可以指定输出格式,但这个 选项可以覆盖它.
`-qmagic'
这个选项被忽略,只是为了跟Linux保持兼容.
`-Qy'
这个选项被忽略,只是为了跟SVR4保持兼容.
`--relax'
一个机器相关的选项. 只有在少数平台上,这个选项被支持.
在某些平台上,'--relax'选项在连接器解析程序中的地址时执行也许的全局优化, 比如松散地址模式和在输出文献中合成新的指令.
在某些平台上,连接时全局优化会进行符号调试导致程序不能运营.
在不支持这个选项的平台上,'--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'选项指定优先搜索的一组途径名.
这个选项必须小心使用,由于它会覆盖那些也许已经被编译进共享库中的搜索途径. 在这种情况下,它就有也许使用一个非内部的不同的搜索途径.
连接器使用下面的搜索途径来定位需要的共享库:
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'存在, 这个文献中有的目录会被搜索.
假如需要的共享库没有被找到, 那连接器会发出一条警告信息,并继续执行连接.
`-shared'
`-Bshareable'
创建一个共享库. 这个选项只在ELF, XCOFF和SunOS平台上有用。 在SunOS上,假如'-e'选项没有被使用,并在连中有未定义的符号,连接器会自动创建一 个共享库,
`--sort-common'
这个选项告诉'ld'当它把普通符号放到相应的输出节中时按大小进行排序。排在最前面的是所有的一字节符号,然后是所有的二字节,然后是所有的四字节,然后是其它的。 这是为了避免由于对齐约束而在符号间产生的断裂
`--split-by-file [SIZE]'
跟'--split-by-reloc'相似,但在SIZE达成时,为每一个输入文献创建一个新的输出节。假如没有给出,SIZE缺省地设立为1
`--split-by-reloc [COUNT]'
试图在输出文献中创建节外的节,这样就没有单个的输出节具有多于COUNT个重定位符。这在产生巨大的用于COFF格式的实时内核的可重定位文献时非常有用;
由于COFF不能在一个节中表达多于65535个重定位。 注意,这在不支持专有节的目的文献格式中会失败,连接器不会把单个输入节分割进行重分派, 所以,假如单个输入节具有多于COUNT个重定位符, 那一个输出节会具有同样多的可重定位符。COUNT缺省被设为32768.
`--stats'
计算并显示关于连接器操作的记录信息, 比如执行时间,内存占用等.
`--traditional-format'
对于某些目的平台, 'ld'的输出会跟某些面有的连接器的输出有所不同. 这个开关规定'ld'使用传统的格式.
比如, 在SunOS上, 'ld'会把符号串表中的两上完全相同的入口合并起来. 这可以把一个带有调试信息的输出文献的大小减小百发之三十. 不幸地是,
SunOS的'dbx'程序不能读取这个输出的程序(gdb就没有问题).
'--trafitinal-format'开关告诉'ld'不要把相同的入口合并起来.
`--section-start SECTIONNAME=ORG'
通过指定ORG, 指定节在输出文献中的绝对地址. 你可以多次使用这个选项来定位多个节. ORG必须是一个十六进制整数; 为了跟基他的连接器兼容,你可以忽略前导'0x'.
展开阅读全文