Linker Script 链接器脚本(2)

来源:互联网 发布:南方数据传输软件 编辑:程序博客网 时间:2024/05/16 10:06

5 为符号指定值
在脚本中,可以为一个符号symbol指定一个值。这样会把符号定义为全局符号symbol。
5.1 Simple Assignments
5.2 PROVIDE
5.1 简单赋值
使用任何的C赋值操作来给一个符号赋值。像下面这样:
symbol = expression ;
symbol += expression ;
symbol -= expression ;
symbol *= expression ;
symbol /= expression ;
symbol <<= expression ;
symbol >>= expression ;
symbol &= expression ;
symbol |= expression ;
第一个例子中,定义了一个符号symbol,并赋值为expression。其他的例子中,symbol必须已被定义,根据操作调整其值。
特殊的符号名"."指示的是位置计数器location counter。你只有在SECTIONS命令中才可以使用。
表达式后的";"是必须的。你可以像命令一样按它们的顺序写符号赋值,或者在SECTIONS命令中像一个语句一样。或者作为SECTIONS命令中输出节描述器的一部分。
例子:
floating_point = 0;
SECTIONS
{
  .text :
    {
      *(.text)
      _etext = .;
    }
  _bdata = (. + 3) & ~ 3;
  .data : { *(.data) }
}
在例子中,符号`floating_point`会被定义为0。符号_etext会被定义为最近的输入节.text地址。符号_bdata定义为接着.text输出节的地址,但对齐到了4自己的边界。
5.2 PROVIDE
在一些情况下,链接器脚本想要定义一个符号,这个符号仅仅被引用但没有被任何链接器中包含的对象定义。例如,传统的链接器定义符号"etext"作为一个函数名,而不会遇到错误。PROVIDE关键字可以用来定义像这样的符号,仅仅在它被引用却没有定义时。语法是:PROVIDE(symbol=expression)。
下面是使用PROVIDE定义"etext"的例子:
SECTIONS
{
  .text :
    {
      *(.text)
      _etext = .;
      PROVIDE(etext = .);
    }
}
在例子中,如果程序定义了"_etext"(有下划线),链接器会给出多个定义的错误。另一方面,如果程序定义"etext"(没有下划线),链接器会在程序中静静地使用这个定义。如果程序引用"etext"但没有定义它,链接器会使用脚本中的定义。
原创粉丝点击