我已经浏览了使用_ 属性 _((section(“name”))的代码。我理解,对于gcc编译器,这允许您告诉链接器将创建的对象放在特定部分“name”(在链接器文件中声明“name”绝对地址)。
这样做有什么意义,而不仅仅是使用.data部分?
答案 0 :(得分:6)
有许多可能的用途。 [编辑添加注释:这只是我自己看过或考虑过的一些用途,而非完整列表。]
例如,Linux内核标记了一些仅在内核引导期间使用的代码和数据部分。这些可以在内核运行后被抛弃,回收空间用于其他用途。您可以使用它来标记需要修补特定处理器变体的代码或数据值,例如,使用或不使用协处理器。
您可以使用它在“特殊”地址空间中生存,这些地址空间将被刻录到PROM或保存在EEPROM中,而不是普通存储器中。
您可以使用它来收集代码或数据区域,用于初始化和清理等目的,就像在程序启动之前和结束时运行的C ++构造函数和析构函数一样,或者使用较短的寻址模式(我不知道)由于我自己没有编写任何ARM代码,因此对ARM应用了多少。)
实际使用取决于链接描述文件。
答案 1 :(得分:2)
从用例的角度来看,有许多不同类型的.data
,如:
.vdso
或vsyscall
页面。或者,另一个示例,引导加载程序和内核)RIP
- 相对寻址,则数据必须在当前正在执行的代码的范围内)所以最后它通常是关于属性(这里使用的词语比__attribute__(...)
允许你在gcc源代码中说明更通用的意义。是否需要另一个部分和/或有用的是...在旁观者眼中 - 系统设计师,即。
section
属性的可用性,因此,允许灵活性,即恕我直言,这是一件好事。