没有合适的资源?快使用搜索试试~ 我知道了~
linux ld链接工具使用说明
4星 · 超过85%的资源 需积分: 11 59 下载量 76 浏览量
2013-01-10
18:40:40
上传
评论 1
收藏 476KB PDF 举报
温馨提示
试读
33页
linux ld链接工具使用说明:对linux ld命令的使用做了详细介绍
资源推荐
资源详情
资源评论
ld中文使用说明
2005-09-13
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://fogblog.blogbus.com/logs/1431930.html
本文档介绍 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'使重定位拷贝后的结果无效。
`-( 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'
剩余32页未读,继续阅读
资源评论
- stefaniesjl2014-09-08很好,非常实用,谢谢
- lelee0072013-10-19不错,很详尽,多谢分享!!!
- 素衣白马客京华2014-05-19还不错吧,基本上所有指令都包含了,但对指令的含义没有解释
- bluesnail19862013-08-12资源不错,清晰详细,不过没目录,想跳转费劲
otinghai000
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功