GLD中文手册(5)

2019-08-20 19:25

值是'0x8000000'加上'.data'输出节的长度. 得到的结果是连接器会把'.bss'输出节放到紧接'.data'节后面的位置.

连接器会通过在必要时增加定位计数器的值来保证每一个输出节具有它所需的对齐. 在这个例子中, 为'.text'和'.data'节指定的地址会满足对齐约束, 但是连接器可能会需要在'.data'和'.bss'节之间创建一个小的缺口. 就这样,这是一个简单但完整的连接脚本. 简单的连接脚本命令.

=============================

在本章中,我们会描述一些简单的脚本命令. 设置入口点.

-----------------------

在运行一个程序时第一个被执行到的指令称为\入口点\你可以使用'ENTRY'连接脚本命

令来设置入口点.参数是一个符号名: ENTRY(SYMBOL)

有多种不同的方法来设置入口点.连接器会通过按顺序尝试以下的方法来设置入口点, 如

果成功了,就会停止.

* `-e'入口命令行选项;

* 连接脚本中的`ENTRY(SYMBOL)'命令; * 如果定义了start, 就使用start的值; * 如果存在,就使用'.text'节的首地址; * 地址`0'.

处理文件的命令.

--------------------------- 有几个处理文件的连接脚本命令. `INCLUDE FILENAME'

在当前点包含连接脚本文件FILENAME. 在当前路径下或用'-L'选项指定的所有路径下搜索这个文件,你可以嵌套使用'INCLUDE'达10层. `INPUT(FILE, FILE, ...)' `INPUT(FILE FILE ...)'

'INPUT'命令指示连接器在连接时包含文件, 就像它们是在命令行上指定的一样.

比如,如果你在连接的时候总是要包含文件'subr.o',但是你对每次连接时要在命令行上输入感到厌烦, 你就可以在你的连接脚本中输入'INPUT (subr.o).

事实上,如果你喜欢,你可以把你所有的输入文件列在连接脚本中, 然后在连接的时候什么也不需要,只要一个'-T'选项就够了.

在一个'系统根前缀'被配置的情况下, 一个文件名如果以'/'字符打头, 并且 脚本也存放在系统根前缀的某个子目录下, 文件名就会被在系统根前缀下搜索.

否则连接器就会企图打开当前目录下的文件. 如果没有发现, 连接器会通过档案库搜索路径进行搜索.

如果你使用了'INPUT (-lFILE)', 'ld'会把文件名转换为'libFILE.a', 就象命令行参数'-l'一样.

当你在一个隐式连接脚本中使用'INPUT'命令的时候, 文件就会在连接时连接脚本文件被包含的点上被包含进来. 这会影响到档案搜索.

`GROUP(FILE, FILE, ...)' `GROUP(FILE FILE ...)'

除了文件必须全是档案文件之外, 'GROUP'命令跟'INPUT'相似, 它们会被反复搜索,直至没有未定义的引用被创建.

`OUTPUT(FILENAME)'

'OUTPUT'命令命名输出文件. 在连接脚本中使用'OUTPUT(FILENAME)'命令跟在命令行中使用'-o FILENAME'命令是完全等效的. 如果两个都使用了, 那命令行选项优先.

你可以使用'OUTPUT'命令为输出文件创建一个缺省的文件名,而不是常用的'a.out'.

`SEARCH_DIR(PATH)'

`SEARCH_DIR'命令给'ld'用于搜索档案文件的路径中再增加新的路径. 使用`SEARCH_DIR(PATH)'跟在命令行上使用'-L PATH'选项是完全等效的. 如果两个都使用了, 那连接器会两个路径都搜索. 用命令行选项指定的路径首先被搜索.

`STARTUP(FILENAME)'

除了FILENAME会成为第一个被连接的输入文件, 'STARTUP'命令跟'INPUT'命令完全相似, 就象这个文件是在命令行上第一个被指定的文件一样. 如果在一个系统中, 入口点总是存在于第一个文件中,那这个就很有用. --

标 题: GLD中文手册--(六)

处理目标文件格式的命令.

----------------------------------------- 有两个处理目标文件格式的连接脚本命令. `OUTPUT_FORMAT(BFDNAME)'

`OUTPUT_FORMAT(DEFAULT, BIG, LITTLE)'

`OUTPUT_FORMAT'命令为输出文件使用的BFD格式命名. 使用

`OUTPUT_FORMAT(BFDNAME)'跟在命令行上使用'-oformat BFDNAME'是完全等效的. 如果两个都使用了, 命令行选项优先.

你可在使用`OUTPUT_FORMAT'时带有三个参数以使用不同的基于'-EB'和'-EL'的命令行选项的格式.

如果'-EB'和'-EL'都没有使用, 那输出格式会是第一个参数DEFAULT, 如果使用了'-EB',输出格式会是第二个参数BIG, 如果使用了'-EL', 输出格式会是

第三个参数, LITTLE.

比如, 缺省的基于MIPS ELF平台连接脚本使用如下命令: OUTPUT_FORMAT(elf32-bigmips, elf32-bigmips, lf32-littlemips) 这表示缺省的输出文件格式是'elf32-bigmips', 但是当用户使用'-EL'命令行选项的时候, 输出文件就会被以`elf32-littlemips'格式创建.

`TARGET(BFDNAME)'

'TARGET'命令在读取输入文件时命名BFD格式. 它会影响到后来的'INPUT'和

'GROUP'命令. 这个命令跟在命令行上使用`-b BFDNAME'相似. 如果使用了 'TARGET'命令但`OUTPUT_FORMAT'没有指定, 最后的'TARGET'命令也被用来 设置输出文件的格式.

其它的连接脚本命令.

---------------------------- 还有一些其它的连接脚本命令. `ASSERT(EXP, MESSAGE)'

确保EXP不等于零,如果等于零, 连接器就会返回一个错误码退出,并打印出MESSAGE.

`EXTERN(SYMBOL SYMBOL ...)'

强制SYMBOL作为一个无定义的符号输入到输出文件中去. 这样做了,可能会引发从标准库中连接一些节外的库. 你可以为每一个EXTERN'列出几个符号, 而且你可以多次使用'EXTERN'. 这个命令跟'-u'命令行选项具有相同的效果.

`FORCE_COMMON_ALLOCATION'

这个命令跟命令行选项'-d'具有相同的效果: 就算指定了一个可重定位的输出文件('-r'),也让'ld'为普通符号分配空间.

`INHIBIT_COMMON_ALLOCATION'

这个命令跟命令行选项`--no-define-common'具有相同的效果: 就算是一个不可重位输出文件, 也让'ld'忽略为普通符号分配的空间.

`NOCROSSREFS(SECTION SECTION ...)'

这个命令在遇到在某些特定的节之间引用的时候会产生一条错误信息. 在某些特定的程序中, 特别是在使用覆盖技术的嵌入式系统中, 当一个节被载入内存时,另外一个节就不会在内存中. 任何在两个节之间的直接引用都会是一个错误. 比如, 如果节1中的代码调用了另一个节中的一个函数,这就会产生一个错误.

`NOCROSSREFS'命令带有一个输出节名字的列表. 如果'ld'遇到任何在这些节之间的交叉引用, 它就会报告一个错误,并返回一个非零退出码. 注意, `NOCROSSREFS'命令使用输出节名,而不是输入节名. `OUTPUT_ARCH(BFDARCH)'

指定一个特定的输出机器架构. 这个参数是BFD库中使用的一个名字. 你可以通过使用带有'-f'选项的'objdump'程序来查看一个目标文件的架构.

为符号赋值.

===========================

你可以在一个连接脚本中为一个符号赋一个值. 这会把一个符号定义为一个全局符号. 简单的赋值.

------------------

你可以使用所有的C赋值符号为一个符号赋值. `SYMBOL = EXPRESSION ;' `SYMBOL += EXPRESSION ;' `SYMBOL -= EXPRESSION ;' `SYMBOL *= EXPRESSION ;' `SYMBOL /= EXPRESSION ;' `SYMBOL <<= EXPRESSION ;' `SYMBOL >>= EXPRESSION ;' `SYMBOL &= EXPRESSION ;' `SYMBOL |= EXPRESSION ;'

第一个情况会把SYMBOL定义为值EXPRESSION. 其它情况下, SYMBOL必须是已经定义了的, 而值会作出相应的调整.

特殊符号名'.'表示定位计数器. 你只可以在'SECTIONS'命令中使用它. EXPRESSION后面的分号是必须的. 表达式下面会定义.

你在写表达式赋值的时候,可以把它们作为单独的部分,也可以作为'SECTIONS'命令中的一个语句,或者作为'SECTIONS'命令中输出节描述的一个部分.符号所在的节会被设置成表达式所在的节.

下面是一个关于在三处地方使用符号赋值的例子: floating_point = 0; SECTIONS {

.text : {

*(.text) _etext = .; }

_bdata = (. + 3) & ~ 3; .data : { *(.data) } }

在这个例子中, 符号`floating_point'被定义为零. 符号'-etext'会被定义为前面一个'.text'节尾部的地址.而符号'_bdata'会被定义为'.text'输出节后面的一个向上对齐到4字节边界的一个地址值.

PROVIDE -------

在某些情况下, 一个符号被引用到的时候只在连接脚本中定义,而不在任何一个被连接进来的目标文件中定义. 这种做法是比较明智的. 比如, 传统的连接器定义了一个符号'etext'. 但是, ANSI C需要用户能够把'etext'作为一个函数使用而不会产生错误. 'PROVIDE'关键字可以被用来定义一个符号, 比如etext', 这个定义只在它被引用到的时候有效,而在它被定义的时候无效.语法是`PROVIDE(SYMBOL = EXPRESSION)'.

下面是一个关于使用'PROVIDE'定义'etext'的例子: SECTIONS {

.text : {

*(.text) _etext = .;

PROVIDE(etext = .); } }

在这个例子中, 如果程序定义了一个'_etext'(带有一个前导下划线), 连接器会给出一个重定义错误. 如果,程序定义了一个'etext'(不带前导下划线), 连接器会默认使用程序中的定义. 如果程序引用了'etext'但不定义它, 连接器会使用连接脚本中的定义.

SECTIONS命令 ================

'SECTIONS'命令告诉连接器如何把输入节映射到输出节, 并如何把输出节放入到内存中.

'SECTIONS'命令的格式如下: SECTIONS {

SECTIONS-COMMAND SECTIONS-COMMAND ... }

每一个SECTIONS-COMMAND可能是如下的一种: * 一个'ENTRY'命令. * 一个符号赋值. * 一个输出节描述. * 一个重叠描述.

'ENTRY'命令和符号赋值在'SECTIONS'命令中是允许的, 这是为了方便在这些命令中使用定位计数器. 这也可以让连接脚本更容易理解, 因为你可以在更有意义的地方使用这些命令来控制输出文件的布局.


GLD中文手册(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:月令司令司权司命

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: