分享

ld链接脚本文件解析之三

 zhouADNjj 2014-03-12

为符号赋值.

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

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

简单的赋值.

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

你可以使用所有的C赋值符号为一个符号赋值.

`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'但不定义它, 连接器会使用连接脚本中的定义.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多