__attribute __((section(“name”)))用法?

时间:2013-08-21 00:40:07

标签: c gcc linker

我已经浏览了使用_ 属性 _((section(“name”))的代码。我理解,对于gcc编译器,这允许您告诉链接器将创建的对象放在特定部分“name”(在链接器文件中声明“name”绝对地址)。

这样做有什么意义,而不仅仅是使用.data部分?

2 个答案:

答案 0 :(得分:6)

有许多可能的用途。 [编辑添加注释:这只是我自己看过或考虑过的一些用途,而非完整列表。]

例如,Linux内核标记了一些仅在内核引导期间使用的代码和数据部分。这些可以在内核运行后被抛弃,回收空间用于其他用途。

您可以使用它来标记需要修补特定处理器变体的代码或数据值,例如,使用或不使用协处理器。

您可以使用它在“特殊”地址空间中生存,这些地址空间将被刻录到PROM或保存在EEPROM中,而不是普通存储器中。

您可以使用它来收集代码或数据区域,用于初始化和清理等目的,就像在程序启动之前和结束时运行的C ++构造函数和析构函数一样,或者使用较短的寻址模式(我不知道)由于我自己没有编写任何ARM代码,因此对ARM应用了多少。)

实际使用取决于链接描述文件。

答案 1 :(得分:2)

从用例的角度来看,有许多不同类型的.data,如:

  • 特定CPU和/或NUMA节点的本地数据
  • 上下文之间共享的数据(如用户/内核空间,.vdsovsyscall页面。或者,另一个示例,引导加载程序和内核)
  • 只读数据或具有特定访问模式/类型限制的其他数据(例如,可缓存性或缓存驻留 - 后者可以在某些ARM SoC上指定)
  • 持续存在“状态转换”的数据(例如休眠图像加载或崩溃内核/快速重启重新初始化)
  • 具有特定生命周期/生命周期的数据(仅在启动期间或操作期间的特定阶段使用,一次写入数据)
  • 特定于特定内核子系统或特定内核模块的数据
  • “代码共同定位”数据(x64中的寻址偏移量为正/负2GB,因此如果您需要RIP - 相对寻址,则数据必须在当前正在执行的代码的范围内)
  • 映射到某些特定硬件寄存器空间VA范围的数据

所以最后它通常是关于属性(这里使用的词语比__attribute__(...)允许你在gcc源代码中说明更通用的意义。是否需要另一个部分和/或有用的是...在旁观者眼中 - 系统设计师,即。

section属性的可用性,因此,允许灵活性,即恕我直言,这是一件好事。