为符号赋值. =========================== 你可以在一个连接脚本中为一个符号赋一个值. 这会把一个符号定义为一个全局符号. 简单的赋值. ------------------ 你可以使用所有的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'但不定义它, 连接器会使用连接脚本中的定义.
|
|