ld中文使用手册完全版.docx
- 文档编号:10668711
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:34
- 大小:37.33KB
ld中文使用手册完全版.docx
《ld中文使用手册完全版.docx》由会员分享,可在线阅读,更多相关《ld中文使用手册完全版.docx(34页珍藏版)》请在冰点文库上搜索。
ld中文使用手册完全版
使用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-oOUTPUT/lib/crt0.ohello.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-symbolfoo'和
`--trace-symbol=foo'是等价的.多字符选项的名字唯一缩写符也是可以被接受的.
注意,如果连接器通过被编译器驱动来间接引用(比如gcc),那所有的连接器命令行选项前必须加上前缀'-Wl'
(或者能被特定编译器驱动接受的其他前缀),就像下面这样:
gcc-Wl,--startgroupfoo.obar.o-Wl,--endgroup
这很重要,因为否则的话,编译器驱动程序会默认丢掉这些连接选项,产生一个错误的连接.
下面是关于被GNU连接器接受的常用命令行开关的一个列表:
`-aKEYWORD'
这个选项在HP/UX兼容系统上被支持.参数KEYWORD必须是下面字符串中的一个:
`archive',
`shared',or`default'.`-aarchive'在功能上跟`-Bstatic'相同,而另外两个关键字功能上跟
`-Bdynamic'相同.这个选项可被多次使用.
`-AARCHITECTURE'
`--architecture=ARCHITECTURE'
在最近发行版本的'ld'中,这个选项只在Intel960系列架构上有用.在那种'ld'配置中,参数
ARCHITECTURE确定960系列的某一特定架构,启用某些安全措施,并修改档案库的搜索路径.
将来的'ld'发行版可能为其它架构系列支持相似的功能.
`-bINPUT-formAT'
`--format=INPUT-formAT'
'ld'可以被配置为支持多于一种的目标文件.如果你的'ld'以这种方式被配置,你可以使用'-b'选
项为输入目标文件指定二进制格式.就算'ld'被配置为支持可选目标格式,你不必经常指定这一项,
因为'ld'被配置为在每一台机子上把最常用的格式作为默认输入格式.INPUT-formAT是一个字符串,
你可能在连接一个不常用的二进制格式文件时需要这个参数.你也可使用'-b'来显式切换格式(在连接
不同格式的目标文件时),方法是在每一组特定格式的目标前使用'-bINPUT-formAT'.
缺省的格式是从环境变量'GNUTARGET'中得到的.你也可以从一个脚本中定义输入格式,使用的命令是
'TARGET'.
`-cMRI-COMMANDFILE'
`--mri-script=MRI-COMMANDFILE'
为了跟MRI生产的连接器兼容,'ld'接受另一种用受限命令语言写成的脚本文件,通过选项'-c'引入MRI
脚本文件;使用'-T'选项是运行用普通'ld'脚本语言写的连接脚本.如果MRI-CMDFILE不存在,'ld'在'-L'
指定的目录中寻找.
`-d'
`-dc'
`-dp'
这三个选项是等价的;多字符形式是为了跟其他连接器兼容才被支持的.它们给普通符号分配空间,即
使一个重定位输出文件已经被指定(通过'-r').脚本命令`FORCE_COMMON_ALLOCATION'具有同样的效果.
`-eENTRY'
`--entry=ENTRY'
使用符号ENTRY作为你的程序的开始执行点,而不是使用缺省的进入点.如果没有叫做ENTRY的符号,连接器
会企图把ENTRY作为一个数字进行分析,并使用它作为入口地址(数字会被解释为10进制的;你可以使用前
导的'0x'强制为16进制,或'0'作为8进制.)
`-E'
`--export-dynamic'
当创建一个动态连接的可执行程序时,把所有的符号加到动态符号表中.动态符号表是一个符号集,这
些符号对于运行时的动态对象是可见的.
如果你不使用这个选项,动态符号表中就会只含有那些连接进来的动态对象中用到的符号
如果你使用'dlopen'来载入动态对象,它需要引用程序中的符号,那你可能需要在连接程序时用到这个
选项.
你也可以使用版本脚本来控制哪些符号应当被加到动态符号表中.
`-EB'
连接big-endian对象.这会影响缺省输出格式.
`-EL'
连接little-endian对象.这会影响缺省输出格式.
`-g'
忽略.为了跟其它工具兼容而提供.
`-i'
执行一个增量连接(跟'-r'等同)
`-initNAME'
当创建一个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风格的magicnumber,把输出标志为'OMAGIC'.
`--no-omagic'
这个选项执行的操作大部分正好跟'-N'相反.它设置text节只读,强制data节页对齐.但是,这个选项
并不开启连接共享库的功能.使用'-Bdynamic'开启这个功能.
`-oOUTPUT'
`--output=OUTPUT'
使用OUTPUT作为'ld'产生的程序的名字;如果这个选项没有指定,缺省的输出文件名是'a.out'.脚本命
令'OUTPUT'也可以被用来指定输出文件的文件名.
`-OLEVEL'
如果LEVEL是一个比0大的数值,'ld'优化输出.这可能会明显多占用时间,所以只有在生成最后的文件
时使用.
`-q'
`--emit-relocs'
把重定位节和内容留在完全连接后的可执行文件中.连接分析和优化工具可能需要这些信息用来进行
正确的修改与执行.这在大的可执行文件中有用.
这个选项目前只支持ELF平台.
`-r'
`--relocateable'
产生可重定位的输出,比如,产生一个输出文件它可再次作为'ld'的输入.这经常被叫做"部分连接".
作为一个副作用,在支持标准Unix魔数的环境中,这个选项会把输出文件的魔数设置为'OMAGIC'.如
果这个选项没有被指定,一个绝对文件就会被产生.当连接C++程序时,这个选项就不会解析构造函数的
引用;要解析,必须使用'-Ur'
如果输入文件跟输出文件的格式不同,只有在输入文件不含有重定位信息的时候部分连接才被支持.输
出格式不同的时候会有更多的限制.比如,有些'a.out'的格式在输入文件是其他格式的时候完全不支
持部分连接.
这个选项跟'-i'等效.
`-RFILENAME'
`--just-symbols=FILENAME'
从FILENAME中读取符号名跟它们的值,但不重位这个文件,或者根本不把它包含在输出文件中.这就允
许你的输出文件引用其它程序中定义的绝对内存地址.你可以多次使用这个选项.
为了跟其他ELF连接器兼容,如果'-R'选项后面跟有一个目录名,而不是一个文件名,它会被处理成
'-rpath'选项.
`-s'
`--strip-all'
忽略输出文件中所有的符号信息.
`-S'
`--strip-debug'
忽略输出文件中所有的调试符号信息(但不是所有符号).
`-t'
`--trace'
打印'ld'处理的所有输入文件的名字.
`-TSCRIPTFILE'
`--script=SCRIPTFILE'
把SCRIPTFILE作为连接脚本使用.这个脚本会替代'ld'的缺省连接脚本(而不是增加它的内容),所以
命令文件必须指定所有需要的东西以精确描述输出文件.如果SCRIPTFILE在当前目录下不存在,'ld'
会在'-L'选项指定的所有目录下去寻找.多个'-T'选项会使内容累积.
`-uSYMBOL'
`--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'开头的本地符号.
`-ySYMBOL'
`--trace-symbol=SYMBOL'
打印出所有SYMBOL出现的被连接文件的名字.这个选项可以被多次使用.在很多系统中,这在预先确定底
线时很有必要.
当你拥有一个未定义的符号,但不知道这个引用出自哪里的时候,这个选项很有用.
`-YPATH'
为缺省的库搜索路径增加一条路径.这个选项是为了跟Solaris兼容.
`-zKEYWORD'
能被识别的关键字包括'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'使重定位拷贝后的
结果无效.
`-(ARCHIVES-)'
`--start-groupARCHIVES--end-group'
ARCHIVES应当是一个关于档案文件的列表.它们可以是显式的文件名,或者'-l'选项.
这些指定的档案文件会被多遍搜索,直到没有新的无定义引用被创建.通常,一个档案文件只会被搜索一
次.但如果这个档案文件中的一个符号需要被用来解析一个档案中的目标引用到的无定义的符号,而这个
符号在命令行上的后面某个档案文件中出现,连接器不能解析这个引用.把这些档案文件分组后,它们都
可被反复搜索直到所有可能的引用都被解析了为止.
使用这个选项有一个很大的运行开销.只有在无法避免在多个档案文件中使用循环引用时才用它.
`--accept-unknown-input-arch'
`--no-accept-unknown-input-arch'
告诉连接器接受那些架构不能被识别的输入文件.但前提假设是用户知道他们在做什么,并且是故意要连
接这些未知的输入文件.在版本2.14之前,这个是连接器的缺省行为.从版本2.14以后的,缺省行为是拒
绝这类输入文件,所以`--accept-unknown-input-arch'选项被用来恢复旧的行为.
`-assertKEYWORD'
这个选项被忽略,只是用来跟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'允许那些从共享库中引用的普通符号只
在主程序中被分配地址.这会消除在共享库中的无用的副本的空间,同时,也防止了在有多个指定了搜索
路径的动态模块在进行运行时符号解析时引起的混乱.
`--defsymSYMBOL=EXPRESSION'
在输出文件中建立一个全局符号,这个符号拥有一个EXPRESSION指定的绝对地址.你可以多次使用这个选
项定义多个符号.EXPRESSION支持一个受限形式的算术运算:
你可以给出一个十六进制常数或者一个已存
在符号的名字,或者使用'+'和'-'来加或减十六进制常数或符号.如果你需要更多的表达式,可以考虑在脚
本中使用连接器命令语言,注意在SYMBOL,=和EXPRESSION之间不允许有空格.
`--demangle[=style]'
`--no-demangle'
这些选项控制是否在错误信息和其它的输出中重组符号名.当连接器被告知要重组,它会试图把符号名以
一种可读的形式的展现:
如果符号被以目标文件格式使用,它剥去前导的下划线,并且把C++形式的符号名
转换成用户可读的名字.不同的编译器有不同的重组形式.可选的重组形式参数可以被用来为你的编译器
选择一个相应的重组形式.连接器会以缺省形式重组直至环境变量`COLLECT_NO_DEMANGLE'被设置.这些
选项可以被用来重载缺省的设置.
`--dynamic-linkerFILE'
设置动态连接器的名字.这个只在产生动态连接的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'
打印一个所有目标平台相关的选项的概要,然后退出.
`-MapMAPFILE'
打印一个连接位图到文件MAPFILE中.参阅上面关于'-M'选项的描述.
`--no-keep-memory'
'ld'通常会以速度优先于内存使用的方式优化程序,这是通过把输入文件的符号表放在内存缓冲中实现的,
这个选项告诉'ld'以内存使用优先来优化,尽可能的减小符号表的重读.这在'ld'在连接一个大文件时
超出内存限制时有用.
`--no-undefined'
`-zdefs'
通常,当创建一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ld 中文 使用手册 完全